當前位置:首頁 » 編程語言 » shmphp

shmphp

發布時間: 2022-09-28 03:45:13

1. FastCGI sent in stderr: "Primary script unknown" 這個問題有沒遇到過沒

默認的nginx連接方式為php-cgi監聽127.0.0.1:9000的方式,使用socket方式連接

nginx配置方法:

location ~ .php$ {

fastcgi_pass unix:/dev/shm/php-fpm.sock;

fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/code/public_html$fastcgi_script_name;
include fastcgi_params;
}

在PHP的www.conf中修改

vi /etc/php-fpm.d/www.conf

;listen = 127.0.0.1:9000

listen = /var/run/php-fpm/php5-fpm.sock

2. php ob_start提高多少速度

由於PHP是「一邊編譯一邊執行」的腳本語言,某種程度上也提供了一種相當方便的結果集緩存使用方法—通過動態include相應的數據定義代碼段的方式使用緩存。

近來做了一陣子程序性能的優化工作,有個比較有意思的想法,想提出來和大家交流一下。

Cache是「以空間換時間」策略的典型應用模式,是提高系統性能的一種重要方法。緩存的使用在大訪問量的情況下能夠極大的減少對資料庫操作的次數,明顯降低系統負荷提高系統性能。相比頁面的緩存,結果集是一種「原始數據」不包含格式信息,數據量相對較小,而且可以再進行格式化,所以顯得相當靈活。由於PHP是「一邊編譯一邊執行」的腳本語言,某種程度上也提供了一種相當方便的結果集緩存使用方法——通過動態include相應的數據定義代碼段的方式使用緩存。如果在「RamDisk」上建緩存的話,效率應該還可以得到進一步的提升。以下是一小段示例代碼,供參考。

// load data with cache

function
load_data($id,$cache_lifetime) {

// the return data

$data =
array();

// make cache filename

$cache_filename =
『cache_『.$id.『.php『;

// check cache file『s last modify time

$cache_filetime = filemtime($cache_filename);

if (time() -
$cache_filetime <= $cache_lifetime) {

//** the cache is not expire

include($cache_filename);

} else {

//** the cache is
expired

// load data from database

// ...

while
($dbo->nextRecord()) {

// $data[] = ...

}

// format
the data as a php file

$data_cache = "
while (list($key, $val) =
each($data)) {

$data_cache .= "\$data[『$key『]=array(『";

$data_cache .= "『NAME『=>\"".qoute($val[『NAME『])."\","

$data_cache .= "『VALUE『=>\"".qoute($val[『VALUE『])."\""

$data_cache .= ";);\r\n";

}

$data_cache = "?>\r\n";

// save the data to the cache file

if ($fd =
fopen($cache_filename,『w+『)) {

fputs($fd,$data_cache);

fclose($fd);

}

}

return $data;

}

?> 適用情況:

1.數據相對比較穩定,主要是讀取操作。

2.文件操作要比資料庫操作快。

3.復雜數據訪問,大數據量訪問,密集數據訪問,系統資料庫負載極重。

4.Web/DB分離結構或者多Web單DB結構。

未經證實的問題:

1.並發訪問時對文件的讀寫是否會引起鎖定問題。

2.涉及到的數據文件太多時,性能如何。

擴展思路:

1.生成JavaScript數據定義代碼,在客戶端調用。

2.還未想到……

望共同探討。

緩存

如果你想要讓自己龐大的PHP應用有更好的性能表現,採用緩存也是一種很好的方法。現在已經有許多緩存方案可供選擇,其中包括:Zend
Cache,APC,和Afterburner Cache。

所有這些產品都屬於「緩存模塊」。當第一次出現對.php文件的請求時,它們會在Web伺服器內存中保存PHP的中間代碼,此後就用「經過編譯」的版本響應後繼的請求。這種方法確實能夠改善應用的性能,因為它使得磁碟訪問量減低到了最少的程度(代碼已經讀取和解析),代碼直接在內存中運行使得伺服器響應請求的速度大大提高。當然,緩存模塊還會監視PHP源文件的變化,必要時重新緩存頁面,從而防止了用戶得到的頁面仍舊由過時的PHP代碼生成。由於緩存模塊能夠明顯地降低伺服器的負載、提高PHP應用的響應效率,因此它們非常適合於負載較大的網站使用。

如何選擇這些緩存產品

Zend Cache是Zend Technologies公司的商業軟體,而Zend
Technologies就是前面提到的那個為我們提供PHP引擎和免費Zend Optimizer的公司。Zend
Cache確實是名不虛傳!對於大型的PHP頁面,你可以感覺到第一次運行之後速度就會有所提高,而且伺服器也會有更多的可用資源。遺憾的是這個產品並不免費,不過在有些情形下它仍舊是物超所值。

Afterburner Cache是來自Bware Technologies的免費緩存模塊,當前這個產品還是Beta版。Afterburner
Cache的做法看起來與Zend Cache差不多,但它對性能的改善程度(還)不能與Zend Cache相比,而且它還不能與Zend
Optimizer一起工作。

APC是Alternative PHP Cache的縮寫,它是來自Community
Connect的又一個免費緩存模塊。這個產品已經具有足夠的穩定性供正式場合使用,而且它看起來也能在很大程度上提高響應請求的速度。

有關壓縮

來自Remote
Communications的免費Apache模塊mod_gzip就具有為支持這類內容編碼的瀏覽器壓縮靜態Web內容的能力。對於絕大多數靜態Web內容,mod_gzip都非常有效。mod_gzip可以方便地編譯到Apache裡面,也可以作為DSO使用。據Remote
communications公司說,mod_gzip也能夠壓縮來自mod_php、mod_perl等的動態內容。我試了一次又一次,但看來還是不行。我看了許多關於mod_gzip的論壇和文章,看來到了mod_gzip的下一個版本(可能是1.3.14.6f)這個問題有望得到解決。在此之前,我們可以在網站的靜態部分使用mod_gzip。

然而有時我們確實蹊要壓縮動態內容,所以必須找找其他辦法。有一種辦法是使用class.gzip_encode.php,這是一個可以用來壓縮頁面內容的PHP類,具體方法是在PHP腳本的開頭和末尾調用該類的某些函數。如果要在網站級實現這個方案,可以從php.ini文件的auto_prepend以及auto_append指令調用這些函數。這種方法雖然有效,但它無疑為高負載的網站帶來了更多的開銷。關於如何使用這個類的詳細說明,請參見它的源代碼。它的源代碼說明相當完善,作者告訴了你所有你必須知道的事情。

PHP
4.0.4有一個新的輸出緩存句柄ob_gzhandler,它與前面的類相似,但用法不同。使用ob_gzhandler時要在php.ini中加入的內容如下:

output_handler = ob_gzhandler
;

這行代碼使得PHP激活輸出緩存,並壓縮它發送出去的所有內容。如果由於某種原因你不想在php.ini中加上這行代碼,你還可以通過PHP源文件所在目錄的.htaccess文件改變默認的伺服器行為(不壓縮),語法如下:

php_value
output_handler ob_gzhandler

或者是從PHP代碼調用,如下所示:
ob_start("ob_gzhandler");

採用輸出緩存句柄的方法確實非常有效,而且不會給伺服器帶來什麼特殊的負荷。但必須注意的是,Netscape
Communicator對壓縮圖形的支持不佳,因此除非你能夠保證所有用戶都使用IE瀏覽器,否則你應該禁止壓縮JPEG和GIF圖形。一般地,對於所有其他文件,這種壓縮都有效,但建議你針對各種瀏覽器都分別進行測試,特別是當你使用了特殊的插件或者數據查看器時這一點尤其重要。

閱讀提示:PEAR 的緩沖包提供了緩沖動態內容,資料庫查詢和 PHP 函數調用的框架。本文介紹如何採用 PEAR 來緩沖 PHP 程序

採用 PEAR 來緩沖 PHP 程序

PHP 世界中緩沖是一個熱門的話題,因為 PHP 產生的動態頁面,每次用戶請求都需要重新計算,不論請求的結果是否一樣,同時,PHP
每次都會編譯一次腳本。這樣的超負荷運轉對一個流量很高的網站來說肯定難以忍受。幸運的是, Web 的結果可以緩沖,而不需要重新運行和編譯腳本,商品化的產品像
ZendCache 或者開源的 Alternate PHP Cache都提供了把 PHP 腳本編譯為位元組代碼並緩沖的辦法。

PEAR
的緩沖包提供了緩沖動態內容,資料庫查詢和 PHP 函數調用的框架。

就像 Perl 有 CPAN, TeX 有 CTAN,PHP
也有自己的中心資源庫,存放類,庫和模塊。這個庫稱為 PEAR(PHP Extension and Add-On
Repository)。

本文假設你已經安裝了 PEAR 環境,如果沒有的話,可以去 PHP 網站下載。PEAR
的緩沖包包含一個總體的緩沖類和幾個特別的子類。緩沖類使用容器類來存貯和管理緩沖數據。

下面是 PEAR
緩沖當前所包含的容器,以及各自的參數:

file -- file 容器在文件系統存儲了緩沖的數據,是最快的容器。

cache_dir
-- 這是容器存儲文件的目錄。

filename_prefix -- 緩沖文件的前綴,例如:"cache_"。

shm -- shm
容器把緩沖數據放入共享內存,基準測試顯示,目前的實現下,這個容器的速度要比文件容器慢。

shm_key --
共享內存使用的鍵值。

shm_perm -- 使用共享內存數據段的許可權。

shm_size --
分配共享內存的大小。

sem_key -- 信號燈的鍵值。

sem_perm -- 信號燈的許可權。

db --
PEAR 的資料庫抽象層。

dsn -- 資料庫連接的 DSN 。可以參考 PEAR 的 DB 文檔。

cache_table --
表的名字。

phplib -- phplib
容器使用資料庫抽象層存儲緩沖。

db_class

db_file

db_path

local_file

local_path

ext/dbx
-- PHP
的資料庫抽象層擴展,如果像把緩沖存入資料庫,可以採用這個容器。

mole

host

db

username

password

cache_table

persistent

使用
PEAR Cache 所得到的性能提升取決於你所選擇的緩沖容器,例如,把資料庫的結果再次存入資料庫緩沖中就顯得毫無意義。

PEAR Cache
的函數緩沖模塊能把任何函數或者方法的結果緩沖,不論是 PHP
的內置函數還是用戶自定義函數,他預設採用文件容器,把緩沖數據放入到一個叫做function_cache 的目錄。

Cache_Function
類的構造器可以有三個可選的參數:

$container :緩沖容器的名字。

$container_options
:緩沖容器的數組參數。

$expires:緩沖對象過期的時間(秒數)。

普通的函數調用採用 Cache_Function 類的
call() 方法時,就能觸發緩沖。調用 call()
很容易,的一個參數是函數的名字,然後是函數的參數,第二個參數是要調用函數中的第一個,依此類推,我們來看例子:

例1
緩沖函數和方法的調用
// 調用 PEAR Cache 的函數緩沖。

require_once
'Cache/Function.php';

// 定義一些類和函數。

class foo {

function
bar($test) {

echo
"foo::bar($test)

";

}

}

class bar {

function
foobar($object) {

echo
'$'.$object.'->foobar('.$object.')

';

}

}

$bar =
new bar;

function foobar() {

echo 'foobar()';

}

//
取得 Cache_Function 對象

$cache = new Cache_Function();

// 對 foo
類的靜態函數 bar() 作緩沖(foo::bar())。

$cache->call('foo::bar',
'test');

// $bar->foobar()

$cache->call('bar->foobar',
'bar');

$cache->call('foobar');

?>

下面我們採用
Cache_Output 來把輸出作緩沖:

例2 緩沖腳本的輸出

// 載入 PEAR
Cache 的輸出緩沖

require_once 'Cache/Output.php';

$cache = new
Cache_Output('file', array('cache_dir' => '.') );

//
計算要緩沖頁面的標記,我們假定頁面的緩沖取決於

// URL, HTTP GET 和 POST 變數以及
cookies。

$cache_id = $cache->generateID(

array('url' =>
$REQUEST_URI, '

post' => $HTTP_POST_VARS, 'cookies' =>
$HTTP_COOKIE_VARS) );

// 查詢緩沖

if ($content =
$cache->start($cache_id)) {

// 緩沖命中

echo
$content;

die();

}

// 緩沖丟失

// -- 在這里插入內容產生代碼
--

// 把頁面存入緩沖

echo $cache->end();

?>
利用 Cache_Output 類,很容易把一個動態的資料庫驅動的網站應用轉化為靜態,從而極大的提升站點的性能。越來越多的站點在採用 GZIP 壓縮
HTML 內容,這樣減少了伺服器的帶寬消耗,對於使用 Modem 上網的用戶來說也能受益不少。

Cache_OutputCompression
擴展了 Cache_Output 類的功能,他把 GZIP 壓縮的 HTML 內容進行緩沖,從而節省了 CPU 壓縮的時間。

閱讀提示:在本篇文章中,我們將對PHP應用程序的分析、如何改變腳本代碼以及比較優化前後的各種參數值進行簡要的介紹。

PHP應用程序的性能優化

使用PHP編程的最大好處是學習這種編程語言非常容易以及其豐富的庫。即使對需要使用的函數不是十分了解,我們也能夠猜測出如何完成一個特定的任務。

盡管PHP非常簡單易學,但我們仍然需要花費一點時間來學習PHP的一些編程技巧,尤其是與性能和內存佔用相關的技巧。在PHP中,有許多小技巧能夠使我們減少內存的佔用,並提高應用程序的性能。在本篇文章中,我們將對PHP應用程序的分析、如何改變腳本代碼以及比較優化前後的各種參數值進行簡要的介紹。

通過在程序中設置計時的程序,並反復執行這些代碼,我們可以獲得有關程序執行速度的一組數據,這些數據可以可以用來發現程序中的瓶頸,以及如何進行優化,提高應用程序的性能。

也許讀者曾經聽說過PEAR庫吧。我們將使用PEAR庫創建在分析時需要使用的例子,這也是對現有的代碼進行分析的最簡單的方法,它使我們無需使用商用產品就能對代碼進行分析。

我們要使用的庫的名字是PEAR::Benchmark,它對於對代碼進行分析和性能測試非常有用。這個庫提供一個名字為Benchmark_Timer()的類,能夠記錄一個函數調用和下一個函數調用之間的時間。在對代碼的性能進行測試時,我們可以得到一個詳細的腳本執行結果,它非常簡單,如下所示:
include_once("Benchmark/Timer.php");

$bench
= new Benchmark_Timer;

$bench-> start();

$bench->
setMarker('Start of the script');

//
現在處於睡眠狀態幾分鍾

sleep(5);

$bench-> stop();

//
從計時器中獲得分析信息

print_r($bench->
getProfiling());

?>

上面代碼執行後的輸出如下所示:

Array

(

[0] => Array

(

[name] =>
Start

[time] => 1013214253.05751200

[diff] =>
-

[total] => 0

)

[1] =>
Array

(

[name] => Start of the script

[time] =>
1013214253.05761100

[diff] => 9.8943710327148E-05

[total]
=> 9.8943710327148E-05

)

[2] =>
Array

(

[name] => Stop

[time] =>
1013214258.04920700

[diff] => 4.9915959835052

[total] =>
4.9916949272156

)

)

上面的數字似乎是一組雜亂無章的數字,但如果程序的規模更大,這些數字就十分地有用了。

也許廣大讀者也能猜測到,數組的第一個表目是實際調用Benchmark_Timer()類的方法,例如

$bench->
start()、$bench-> setMarker()和$bench->
stop(),與這些表目有關的數字是相當簡單的,現在我們來仔細地研究這些數字:

[0] => Array

(

[name] => Start

[time] => 1013214253.05751200

[diff] => -

[total] => 0

)

time表目指的是何時對Benchmark_Timer()的start()方法調用的UNIX的timestamp,diff表目表示這次調用和上次調用之間的時間間隔,由於這里沒有上一次,因此顯示出了一個破折號,total表目指的是自測試開始到這一特定的調用之前代碼運行的總的時間。下面我們來看看下一個數組的輸出:

[1]
=> Array

(

[name] => Start of the script

[time] => 1013214253.05761100

[diff] =>
9.8943710327148E-05

[total] => 9.8943710327148E-05

)
從上面的數字我們可以看出,在調用$bench->
start()之後,程序運行了9.8943710327148E-05秒(也就是0.0000989秒)後開始調用$bench->
setMarker(....)。

一次真實的性能測試經歷

盡管上面的例子不錯,但在對於決定如何優化你的站點代碼設計方面,它真的不能算是一個好例子。下面我將用我自己作為網站技術人員的一段親身經歷來說明如何解決性能方面存在的問題。

我並不大理解網站使用的代碼,因為它是根據特殊的需求,歷經多年開發而成的━━其中的一個模塊包括網站轉換代碼,另一個模塊記錄網站的使用情況,其他的模塊也各有各的作用。我和網站的主要開發者都意識到網站的代碼需要優化,但又不清楚問題出在哪兒。

為了盡快地完成任務,我開始研究網站的主要腳本代碼,並在全部腳本代碼以及其包含文件中添加了一些$bench->
setMarker()命令,然後分析$bench->
getProfiling()的輸出,並對得到的結果大吃一驚,原來問題出在一個與獲得特定語言名字(例如en代表english)的轉換代碼的函數調用中,該函數在每個頁面上都會被使用數百次。每次調用該函數時,腳本代碼都會對一個Mysql資料庫進行查詢,從一個資料庫表中獲得真正的語言名字。

於是我們這一類的信息創建了一個緩沖系統。經過短短2天時間的工作,我們使系統的性能得到了很大的提高,第一周內頁面的瀏覽量也因此而增加了40%。當然了,這只是一個有關分析代碼能夠提高互聯網應用或互聯網網站性能的例子。

性能測試函數調用

在分析一個腳本或網頁(以及其包含文件)時,盡管Benchmark_Timer()特別有用,但它並不科學,因為要獲得分析的數據我們必須多次載入腳本,而且它也不是針對某個類或函數調用的。

PEAR::Benchmark庫中的另一個被稱作Benchmark_Iterator的類能夠很好地解決這一個問題,它能夠針對特定的函數或類的方法,顯示其分析信息。它的用途是能夠能夠從測試中獲得一致的結果,因為我們知道,如果運行一段腳本一次,其運行時間為10秒,並不意味著它每次的運行時間總是10秒。
In
any case, let's see some examples:

//
連接資料庫的代碼

include_once("DB.php");

$dsn = array(

'phptype'
=> 'mysql',

'hostspec' => 'localhost',

'database'
=> 'database_name',

'username' =>
'user_name',

'password' => 'password'

);

$dbh =
DB::connect($dsn);

function getCreatedDate($id)

{

global
$dbh;

> $stmt = "SELECT created_date FROM users WHERE
id=$id";

// 在這里使用PEAR::DB

$created_date = $dbh->
getOne($stmt);

if ((PEAR::isError($created_date)) ||

(empty($created_date))) {

return false;

} else
{

return $created_date;

}

}

include_once
'Benchmark/Iterate.php';

$bench = new Benchmark_Iterate;

//
運行getDate函數10次

$bench-> run(10, 'getCreatedDate', 1);

//
列印分析信息

print_r($bench-> get());

?> 運行上面的代碼能夠產生與下面相似的結果:

Array

(

[1] => 0.055413007736206

[2] =>
0.0012860298156738

[3] => 0.0010279417037964

[4] =>
0.00093603134155273

[5] => 0.00094103813171387

[6] =>
0.00092899799346924

[7] => 0.0010659694671631

[8] =>
0.00096404552459717

[9] => 0.0010690689086914

[10] =>
0.00093603134155273

[mean] => 0.0064568161964417

[iterations]
=> 10

)
上面的這些數字很好理解,mean條目表示getCreatedDate()函數10次運行的平均時間。在進行實際測試時,應該至少運行1000次,但這個例子得出的結果已經足夠說明問題了。

3. php網站不能進後台

伺服器出現錯誤提示 1.網頁無法打開。 2.出現 php has encountered an unhandled exception code xxxxxxx. xxxxxxxxxxx 解決方法如下: 1. - 控制面板--> 管理工具--> 組件服務 2. - 展開 組件服務--> 計算機 --> 我的電腦 --> com+ 應用程序 3. - 右鍵點擊 iis out-of-process pooled applications 選擇屬性 4. - 選擇 "標識" 選項卡 5. - 選擇 "互動式用戶 - 目前已登錄的用戶" 6. - 點 "確定" 7. - 重啟伺服器 伺服器出現錯誤提示 1.網頁無法打開。 2.出現 php has encountered an unhandled exception code xxxxxxx. xxxxxxxxxxx 解決方法如下: 1. - 控制面板--> 管理工具--> 組件服務 2. - 展開 組件服務--> 計算機 --> 我的電腦 --> com+ 應用程序 3. - 右鍵點擊 iis out-of-process pooled applications 選擇屬性 4. - 選擇 "標識" 選項卡 5. - 選擇 "互動式用戶 - 目前已登錄的用戶" 6. - 點 "確定" 7. - 重啟伺服器 第二個問題 這個問題不是很好處理,困惑了很多站長非常時間了 主要出現在windows主機的伺服器上。 在php官方, http://bugs.php.net/ 也能夠查到兩三千頁的報告,他們官方也是束手無策,經過了11個小版本後,還是沒有徹底解決 http://bugs.php.net/search.php?cmd=display&search_for=PHP+has+encountered+an+Access&x=8&y=9 目前我提供一下這幾年我維護經驗,我的一些民間解決辦法 第一種可能: 去掉 php中 eaccelerator 的擴展 這樣做能夠解決您的問題,不過可能會加重系統負擔 因為eaccelerator主要是為了節省系統資源的東西 具體做法是找到php.ini 如果是我幫您配置的,一般在c:/php/php.ini或者 c:/winnt/php.ini 或者c:/windows/php.ini 去掉 zend_extension_ts="C:\php\extensions\eaccelerator_win_xxx.dll" eaccelerator.shm_size="16" eaccelerator.cache_dir="c:\temp" eaccelerator.enable="1" eaccelerator.optimizer="1" eaccelerator.check_mtime="1" eaccelerator.debug="0" eaccelerator.filter="" eaccelerator.shm_max="0" eaccelerator.shm_ttl="0" eaccelerator.shm_prune_period="0" eaccelerator.shm_only="0" eaccelerator.compress="1" eaccelerator.compress_level="9" ea主要是在unix環境下開發的,但是作者忽略到windows實際上不像u主機那樣,是沒有u主機的那種內存共享機制的 這個bug已經提交給他們了,希望0.9.5能夠解決 當然,如果您的機器這個問題不嚴重,建議還是保留,ea是一塊非常優秀的Php緩存+加速軟體 配合zo使用,將會降低系統負擔 50%-80%左右,提高負載能力、速度和效率 200%左右 第二種可能 session_save_path 需要設定一個實際的物理路徑,並且該目錄需要everyone的所有許可權,類似U主機的0777 第三種可能 c:/winnt/temp 或者 c:/windows/temp 也需要everyone的所有許可權,類似U主機的0777 第四種

4. nginx埠轉發,php報錯

root**;是什麼意思??去掉試試。

location~.php{
#fastcgi_passremote_php_ip:9000;
fastcgi_passunix:/dev/shm/php-cgi.sock;
fastcgi_indexindex.php;
includefastcgi_params;
set$real_script_name$fastcgi_script_name;
if($fastcgi_script_name~"^(.+?.php)(/.+)$"){
set$real_script_name$1;
#set$path_info$2;
}
fastcgi_paramSCRIPT_FILENAME$document_root$real_script_name;
fastcgi_paramSCRIPT_NAME$real_script_name;
#fastcgi_paramPATH_INFO$path_info;
}

5. CentOS 7 用戶怎樣安裝 LNMP

配置安裝
基於 YUM 特性,可以簡單快速的安裝 LNMP 環境。

配置 YUM 源
CentOS 7 的 默認 YUM 源里的軟體包版本可能不是最新的,如果要安裝最新的軟體包就得配置下 YUM 源。
配置 YUM 源可以通過直接安裝 RPM (Red Hat Package Manager) 包,或者修改 Repository,本文講解通過安裝 RPM 方式。
首先需要安裝 EPEL ( Extra Packages for Enterprise linux ) YUM 源,用以解決部分依賴包不存在的問題:
yum install -y epel-release

接著是 MySQL YUM 源,MySQL 官網給出了配置教程,因為本文章講解的是 CentOS 7,我們只需要安裝對應的 RPM 包就行了。
安裝 RPM 包前需要導入 RPM-GPG-KEY 文件,不然安裝過程會出錯。
將 MySQL RPM-GPG-KEY 另存為 mysql_pubkey.asc 並導入 :
rpm --import mysql_pubkey.asc

導入後安裝 CentOS 7 的 MySQL RPM 包:
rpm -Uvh http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

然後是 PHP YUM 源,PHP 最新的 RPM 包,可以使用 Remi's RPM repository。
導入 PHP RPM-GPG-KEY (remi):
rpm --import http://rpms.remirepo.net/RPM-GPG-KEY-remi

安裝 PHP RPM (remi) 包:
rpm -Uvh http://remi.mirrors.arminco.com/enterprise/remi-release-7.rpm

最後是 Nginx YUM 源,Nginx 官網也給出了配置教程。
導入 Nginx RPM-GPG-KEY:
rpm --import http://nginx.org/packages/keys/nginx_signing.key

安裝 Nginx RPM 包:
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

到目前為止,YUM 源已經安裝好了 ,接著進行下一步的配置。
MySQL YUM 源默認是啟用的 MySQL-5.6,PHP YUM 源默認都沒有啟用,Nginx YUM 源默認是啟用的 Nginx-1.8。
定位到 /etc/yum.repos.d/,對 後綴為 .repo 的文件進行編輯,修改 enabled 為 1 以啟用。
啟用 PHP-7.0 :
1、修改 /etc/yum.repos.d/remi.repo,將 [remi] 和 [remi-test] 下面的 enabled=0 改為 enabled=1;
2、修改 /etc/yum.repos.d/remi-php70.repo,將 [remi-php70] 下面的 enabled=0 改為 enabled=1;
sed -i "/remi\/mirror/{n;s/enabled=0/enabled=1/g}" /etc/yum.repos.d/remi.repo
sed -i "/test\/mirror/{n;n;s/enabled=0/enabled=1/g}" /etc/yum.repos.d/remi.repo
sed -i "/php70\/mirror/{n;s/enabled=0/enabled=1/g}" /etc/yum.repos.d/remi-php70.repo

到這一步 YUM 配置就算完成了,清除並生成 YUM 緩存使之生效:
yum clean all
yum makecache

安裝 MySQL + PHP + Nginx + phpMyAdmin
YUM 源已經配置好了,現在直接安裝 MySQL + PHP + Nginx + phpMyAdmin:
yum install -y mysql-community-server nginx php php-bcmath php-fpm php-gd php-json php-mbstring php-mcrypt php-mysqlnd php-opcache php-pdo php-pdo_dblib php-pgsql php-recode php-snmp php-soap php-xml php-pecl-zip phpMyAdmin

註:上面安裝的 php-* 可以根據實際使用情況選擇安裝
安裝完成後,進行下一步的環境配置,MySQL 配置文件在 /etc/my.cnf.d/,PHP 配置文件在 /etc/php-fpm.d/,Nginx 配置文件在 /etc/nginx/ ,phpMyAdmin 的配置文件在 /etc/phpMyAdmin/。

配置 MySQL
MySQL 配置文件保持默認,運行一次安全配置即可。
啟動 MySQL:
systemctl start mysqld.service

安全配置 MySQL:
設置 root 密碼、刪除匿名用戶、禁止 root 遠程登錄、刪除 test 資料庫、重新載入許可權表,一路 Y 下去
mysql_secure_installation

配置 PHP
PHP 默認配置文件使用的是監聽 9000 埠進行通信,針對小型單一、沒有做負債均衡的伺服器,可以使用 unix sock 方式通信。
使用 unix sock 方式需要修改 PHP 配置文件:
#更換監聽方式
listen = /dev/shm/php-fpm-default.sock

#監聽隊列最大長度為不限
listen.backlog = -1
#指定監聽用戶和用戶組(需存在)
listen.owner = www
listen.group = www

啟動 PHP-FPM:
systemctl start php-fpm.service

配置 Nginx
讓伺服器默認訪問顯示為 400 提示頁。
#新建名為 nginx-default.conf 的配置文件
touch /etc/nginx/conf.d/nginx-default.conf
#編輯配置文件
vi /etc/nginx/conf.d/nginx-default.conf

將以下信息輸入到 nginx-default.conf
server
{
listen 80 default;
return 400;
}

按下 Esc,輸入 :x 保存並退出。
防火牆放行 HTTP 埠訪問:
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --reload

啟動 Nginx:
systemctl start nginx.service

這時,在瀏覽器地址欄輸入當前伺服器 IP 就會看到一個 400 的提示頁面了。
進階!綁定域名+站點目錄+保存日誌+運行 PHP的配置文件:
server
{
listen 80; #監聽80埠
server_name default.com www.default.com; #綁定域名 default.com 和 www.default.com
index index.html index.htm index.php; #設置首頁文件,越前優先順序越高
charset utf-8; #設置網頁編碼

root /home/wwwroot/default; #設置站點根目錄

#運行 PHP
location ~ .*\.php$
{
fastcgi_pass 127.0.0.1:9000 #默認使用9000埠和PHP通信
#fastcgi_pass unix:/dev/shm/php-fpm-default.sock; #使用 unix sock 和PHP通信
fastcgi_index index.php;
fastcgi_param DOCUMENT_ROOT /home/wwwroot/default; #PHP 文檔根目錄
fastcgi_param SCRIPT_FILENAME /home/wwwroot/default$fastcgi_script_name; #PHP 腳本目錄
include fastcgi_params;
try_files $uri = 404;
}

#設置文件過期時間
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp3|wma)$
{
expires 30d;
}

#設置文件過期時間
location ~ .*\.(js|css)$
{
expires 12h;
}

#設置文件訪問許可權
location ~* /templates(/.*)\.(bak|html|htm|ini|old|php|tpl)$ {
allow 127.0.0.1;
deny all;
}

#設置文件訪問許可權
location ~* \.(ftpquota|htaccess|htpasswd|asp|aspx|jsp|asa|mdb)?$ {
deny all;
}

#保存日誌
access_log /var/log/nginx/default-access.log main;
error_log /var/log/nginx/default-error.log crit;
}

配置 phpMyAdmin
# 編輯配置文件
vi etc/phpMyAdmin/config.inc.php

修改以下內容:
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '3306';
$cfg['Servers'][$i]['socket'] = '/var/lib/mysql/mysql.sock';
$cfg['Servers'][$i]['connect_type'] = 'socket';
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['UploadDir'] = '/tmp';
$cfg['SaveDir'] = '/tmp';

如果Nginx使用的是上面的進階代碼,那麼把 phpMyAdmin 的目錄 復制到 /home/wwwroot/default/phpMyAdmin/ 下面,就可通過 http://default.com/phpMyAdmin 訪問了:
#復制 phpMyAdmin 目錄
cp -a /usr/share/phpMyAdmin /home/wwwroot/default/

#替換連接形式為目錄
rm -rf /home/wwwroot/default/phpMyAdmin/doc/html
cp -a /usr/share/doc/phpMyAdmin-<span class="pl-k">*</span>/html /home/wwwroot/default/phpMyAdmin/doc/

一鍵腳本
上面已經講解了如何配置和安裝,但是不能每次都這么一步一步來吧?為了節省時間,麥蔥寫了一個一鍵安裝管理腳本,可選擇安裝 Nginx 1.8/1.9、 MySQL 5.5/5.6/5.7 和 PHP 5.5/5.6/7.0。
安裝
yum install -y unzip

wget https://github.com/maicong/LNMP/archive/master.zip

unzip master.zip

cd LNMP-master

bash lnmp.sh

# 輸出到指定文件
# bash lnmp.sh 2>&1 | tee lnmp.log

管理站點
service vhost (start,stop,list,add,edit,del,exit) <domain> <server_name> <index_name> <rewrite_file> <host_subdirectory>

start 啟動
stop 停止
list 列出
add 添加
edit 編輯
del 刪除
exit 什麼都不做
<domain>: 配置名稱,例如:domain
<server_name>: 域名列表,例如:domain.com,www.domain.com
<index_name>: 首頁文件,例如:index.html,index.htm,index.php
<rewrite_file>: 偽靜態規則文件,保存在 /etc/nginx/rewrite/ 例如:nomal.conf
<host_subdirectory>: 是否支持子目錄綁定,on 或者 off
示例:
#添加一個標識為 domain 的站點
service vhost add domain domain.com,www.domain.com index.html,index.htm,index.php nomal.conf on

#啟動標識為 domain 的站點
service vhost start domain

#停止標識為 domain 的站點
service vhost stop domain

#編輯標識為 domain 的站點
service vhost edit domain

#刪除標識為 domain 的站點
service vhost del domain

#列出所有站點
service vhost list

備份數據
service vbackup (start,list,del) <delete name.tar.gz>

start 添加
list 列出
del 刪除
示例:
#添加一個新的備份
service vbackup start

#列出備份文件
service vbackup list

#刪除一個備份
service vbackup del name.tar.gz

6. 真心求助.nginx錯誤

Nginx伺服器錯誤一般有以下幾點原因:

1、請求的header過大。nginx默認的header長度上限是4k,如果超過了這個值,nginx會直接返回400錯誤.

解決方法:配置nginx.conf相關設置。可以通過以下2個參數來調整header上限:

client_header_buffer_size 16k;large_client_header_buffers 4 16k。

2、上傳文件過程中出現錯誤。這時瀏覽器顯示「413 Request Entity Too Large」。這是因為沒有設置client_max_body_size,這個參數默認只是1M,也就是說發布的文章內容大小不能超過1M。

解決方法:增加如下兩行到nginx.conf的http{}段, 增大nginx上傳文件大小限制:設置允許發布內容為8M:client_max_body_size 8M;client_body_buffer_size 128k。

另外如果運行的是php,那麼還要檢查php.ini,這個大小client_max_body_size要和php.ini中的如下值的最大值一致或者稍大,這樣就不會因為提交數據大小不一致出現的錯誤:post_max_size = 8M;upload_max_filesize = 6M。

修改完配置後,別忘記重新載入。

3、客戶端在為等到伺服器相應返回前就關閉了客戶端描述符。一般出現在客戶端設置超時後,伺服器主動關閉。

解決方法:根據實際Nginx後端伺服器的處理時間修改客戶端超時時間。

4、腳本錯誤(php語法錯誤、lua語法錯誤)。

解決方法:查看nginx_err_log php_err_log。

5、訪問量過大,系統資源限制,不能打開過多文件。 磁碟空間不足。(access log開啟可能導致磁碟滿溢,伺服器主動關閉)。

解決方法:修改/etc/sysctl.conf文件,並使用下面的命令確認: #sysctl -p。要使 limits.conf 文件配置生效,必須要確保 pam_limits.so 文件被加入到啟動文件中。

6、後端服務無法處理,業務中斷。

解決方法:從後端日誌獲取錯誤原因,解決後端伺服器問題。

7、後端伺服器在超時時間內,未響應Nginx代理請求。

解決方法:根據後端伺服器實際處理情況,調正後端請求超時時間。

8、網站頁面緩存過大。

解決方法:配置nginx.conf相關設置:fastcgi_buffers 8 128k;send_timeout 60。


7. linux 中 系統是怎樣利用/run/shm的請高手指點

tmpfs是Linux/Unix系統上的一種基於內存的文件系統。tmpfs可以使用您的內存或swap分區來存儲文件。由此可見,tmpfs主要存儲暫存的文件。它有如下2個優勢 : 1. 動態文件系統的大小。2. tmpfs 的另一個主要的好處是它閃電般的速度。因為典型的 tmpfs 文件系統會完全駐留在內存 RAM 中,讀寫幾乎可以是瞬間的。同時它也有一個缺點 tmpfs 數據在重新啟動之後不會保留,因為虛擬內存本質上就是易失的。所以有必要做一些腳本做諸如載入,綁定的操作。

1
/dev/shm/是一個設備文件,它使用就是tmpfs文件系統(注意:在Centos和Redhat下,/dev/shm目錄是一個鏈接,指向/run/shm目錄,在Ubuntu系統下tmpfs文件系統對應的是/run/shm目錄,可以使用df命令查看),因為 /dev/shm/這個目錄不在硬碟上,而是在內存里,它就所謂的tmpfs。在Redhat/CentOS等linux發行版中默認大小為物理內存的一半。 比如我的的Red Hat Enterprise Linux Server 5.4 64(單核,512內存)分配內存為512M,所以/dev/shm為250M左右,查看/dev/shm如下:

[root@AY1212111202285f63122 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 20G 7.6G 11G 42% /
tmpfs 250M 0 250M 0% /dev/shm

2
tmpfs是基於內存的文件系統,創建時不需要使用mkfs等初始化。如我想把/dev/shm tmpfs大小改為512M,修改/etc/fstab中的

tmpfs /dev/shm tmpfs defaults 0 0
改為
tmpfs /dev/shm tmpfs,defaults,size=512m 0 0

3
然後執行mount -o remount /dev/shm

[root@AY1212111202285f63122 ]# mount -o remount /dev/shm
[root@AY1212111202285f63122 ]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 20G 7.6G 11G 42% /
tmpfs 512M 0 512M 0% /dev/shm

4
tmpfs(/dev/shm)的使用及應用場景:

tmpfs是基於內存的,速度是不用說的,硬碟和它沒法比。Oracle 中的Automatic Memory Management特性就使用了/dev/shm。另外如果在網站運維中好好利用tmpfs,將有意想不到的收獲。我們先在/dev/shm建一個tmp目前,並與/tmp綁定。

[root@AY1212111202285f63122 ~]# mkdir /dev/shm/tmp
[root@AY1212111202285f63122 ~]# chmod 1777 /dev/shm/tmp //注意許可權
[root@AY1212111202285f63122 ~]# mount --bind /dev/shm/tmp /tmp
[root@AY1212111202285f63122 ~]# ls -ld /tmp
drwxrwxrwt 2 root root 40 May 29 21:46 /tmp
以下/tmp使用tmpfs文件系統的一些應用示例,一般tmpfs內存文件系統在做web緩存,臨時文件存儲時會對web訪問有很好的加速作用,從而提高網站訪問的速度。

5
將php的session文件放在/tmp下

對於一個訪問量大的以apache php的網站,可能tmp下的臨時文件都會很多,比如seesion或者一些緩存文件,那麼你可以把它保存到tmpfs文件。保存seesion的方法很簡單了:只要修改php.ini就行了,通過phpinfo測試文件查看你的php session存儲位置,如果不在/tmp下,修改php.ini文件,修改如下:
session.save_path = 「/tmp」

6
將服務的socket文件放在/tmp下

如nginx.socket和mysql.sock
至於tmpfs的其他應用,我想大家可能通過這篇文章會有所啟發。再次強調下:tmpfs 數據在重新啟動之後不會保留,重啟tmpfs 數據會丟失,所以有必要做一些腳本做諸如載入,綁定的操作!

END
注意事項
tmpfs不具備持久性,重啟後數據不保留,請務必注意

8. 使用php如何獲取微信文章

可以嘗試使用DOM操作庫simple-html-dom.php,快速獲取HTML結構的內容:
<?php
require dirname(__FILE__).'/simple_html_dom.php';
$html = file_get_html('http://php.net/');
$articles = array();
foreach($html->find('article.newsentry') as $article) {
$item['time'] = trim($article->find('time', 0)->plaintext);
$item['title'] = trim($article->find('h2.newstitle', 0)->plaintext);
$item['content'] = trim($article->find('div.newscontent', 0)->plaintext);
$articles[] = $item;
}
print_r($articles);
可以把抓取到的內容寫入置於內存上的SQLite(/run/shm/php/crawler.db3),避免頻繁的磁碟IO.

9. PHP的擴展模塊怎麼添加

在PHP/etc 文件夾中加入擴展
在PHP 文件夾下的php.ini文件里 有很多dll文件的地方加入一行 你所添加的擴展的名字xxxx.dll

或者 是 在php.ini中直接打開對應的擴展 ,將目標行的 ; 給去掉
哦,對了,最後記得要重新啟動PHP的伺服器

10. swoole 怎麼在nginx下運行

swoole 框架的性能在使用nginx和php-fpm的時候並沒有大的提升,如果使用app_server,據作者說性能較php-fpm有2倍的提升。

app_server.php使用官方例子:

<?php
define('DEBUG','on');
define("WEBPATH",realpath(__DIR__.'/../'));
requiredirname(__DIR__).'/libs/lib_config.php';
$server=::create(__DIR__.'/swoole.ini');
$server->setAppPath(WEBPATH.'/apps/');//設置應用所在的目錄
$server->setDocumentRoot(WEBPATH);
$server->setLogger(newSwooleLogEchoLog(__DIR__."/webserver.log"));//Logger
//$server->daemonize();//作為守護進程
$server->run(array('worker_num'=>1,'max_request'=>5000,'log_file'=>'/tmp/swoole.log'));

重點來了,nginx配置:

location/{
if(!-e$request_filename){
proxy_passhttp://127.0.0.1:8888;
}
}
location~.*.(php|php5)?${
proxy_passhttp://127.0.0.1:8888;
#fastcgi_pass127.0.0.1:8888;
#fastcgi_passunix:/dev/shm/php-cgi.sock;
#fastcgi_indexindex.php;
#includefastcgi.conf;
}

其實有了第一條配置就可以正常訪問了(除了首頁),增加第二條主要是為了訪問首頁。

熱點內容
vivo微信怎麼加密碼鎖 發布:2024-12-26 11:34:14 瀏覽:403
對蟻群演算法 發布:2024-12-26 11:15:53 瀏覽:807
tiobe編程語言社區 發布:2024-12-26 10:48:11 瀏覽:423
日立存儲微碼升級 發布:2024-12-26 10:43:48 瀏覽:152
如何建立家庭網站伺服器 發布:2024-12-26 10:40:46 瀏覽:185
安卓顯示e是什麼意思 發布:2024-12-26 10:35:13 瀏覽:705
電磁爐編程 發布:2024-12-26 10:30:51 瀏覽:97
經典福克斯壓縮比是多少 發布:2024-12-26 10:26:33 瀏覽:747
存取速度最快的存儲器是 發布:2024-12-26 10:17:39 瀏覽:66
我的世界伺服器只能邊跳邊走 發布:2024-12-26 09:55:26 瀏覽:464