當前位置:首頁 » 編程語言 » phpini優化

phpini優化

發布時間: 2022-12-31 09:24:22

1. php+apache+mysql配置性能怎麼優化

集成安裝?你用window伺服器?
改成linux伺服器,性能馬上提升
然後如果前端頁面多的話,可以考慮nginx
如果內存不夠,考慮升級,或者優化php
再加點緩存技術

2. PHP環境構建

PHP的配置有一些小細節需要注意,這是我的一點總結,到我博客去看看吧,有許多我學習過程中的經驗總結,注意我的並不是詳細的安裝教程,而是一些常見問題的解決方法。http://blog.sina.com.cn/s/blog_5d8945610100bggn.html

這是從網上轉的一個教程,可以參考:
第一步:直接解壓縮放到D盤PHP5目錄下。
第二步:將 PHP 目錄添加到 PATH 環境變數中
在「我的電腦」上點右鍵,打開「屬性」頁面,選擇「高級」標簽頁,點擊「環境變數」按鈕,在「系統變數」欄中找到 Path 這一項(可能需要將滾動條向下滾動才能找到),滑鼠雙擊 Path 這一項,在最後加入PHP 目錄,包括前面的「;」(如: ;D:\PHP5 ),點擊「確定」;
第三步:為 PHP 設置一個有效的配置文件,php.ini。
在 ZIP 包中有兩個 ini 文件,php.ini-dist 和 php.ini-recommended。建議使用 php.ini-recommended,因為在該文件中優化了性能和安全。請仔細閱讀該文件中的注釋,因為它從 php.ini-dist 修改而來,會對設置產生較大的影響。例如將 display_errors 設置為 off,將 magic_quotes_gpc 設置為 off。除了閱讀這些部分,還可以學習一下 ini 設置,並手動設置每一個配置項目。如果想要最安全的設置,這是最好的方法,雖然 PHP 在默認配置下也是很安全的。復制所選擇的 ini 文件到 PHP 能找到的目錄中,並將其重命名為 php.ini 。 先將D:\PHP5\php.ini-recommended 重命名為 php.ini 。再用記事本打開 php.ini,查找register_globals = Off,把off改成On ;再查找short_open_tag = Off,把off改成On ,此處一般能解決運行安裝Discuz!論壇時出現空白的問題。 再查找extension_dir = "./" 改為 extension_dir = "D:\PHP5\ext" (指定動態連接庫的目錄,php5和php4不同的地方就是它的動態連接庫目錄變了,這在它的文檔結構里有詳細的說明) 然後再查找以下字元串,把代碼前的分號去掉。
extension=php_mbstring.dll 這個不選的話用phpMyAdmin會出現紅色提示
extension=php_dba.dll
extension=php_dbase.dll
extension=php_filepro.dll 可選
extension=php_gd2.dll 支持GD庫的,一般要滴 extension=php_imap.dll 可選 extension=php_ldap.dll
extension=php_mysql.dll 支持MySQL的
接下來修改了一些文件上傳以及內存使用最大限制:
memory_limit = 20M 內存容量
post_max_size = 20M 快閃記憶體容量
upload_max_filesize = 20M 附件容量 修改後保存關閉文件即可。

第四步:使 php.ini 文件在 Windows 下被 PHP 所用:
在「我的電腦」上點右鍵,打開「屬性」頁面,選擇「高級」標簽頁,點擊「環境變數」按鈕,在「系統變數」欄中,點擊「新建」按鈕並在「變數名」中輸入「PHPRC」,在「變數值」中輸入 php.ini 文件所在的目錄(例如: D:\PHP5 ),點擊「確定」

3. 啟動php-fpm時是怎麼載入php.ini

php.ini:決定php語言運行的環境,支持擴展的模塊,開發環境的配置

php-fpm.conf:進程式控制制管理器配置文件,控制php-cgi的進程數,常駐內存,提高web服務的響應速率,php-cgi運行時會載入這兩個配置文件。

4. 如何配置php伺服器

一、使用Apache

≡ PHP 5.2.5 的安裝 ≡
1、到其官方站點下載 php-5.2.5-Win32.zip 並解壓(據說:不要下載及使用它的Installer,這種方式雖然很自動化、很智能,但也存在很多方面的限制,因為不推薦。)到一個目錄"D:\PHP\PHP"。
將PHP目錄(D:\PHP\PHP)下的php.ini-recommended復制到windows(有的系統是winnt目錄)目錄下,並改名為php.ini,並找到extension_dir,將它修改為extension_dir="D:\PHP\PHP\ext"。其實使用php.ini-dist也能達到同樣的效果,但建議使用 php.ini-recommended,因為此文件對默認設置作了性能和安全上的優化。
PHP.ini部分說明:
default_charset="gb2312" ,修改默認字元集,這里,如果前面有分號「;」,去掉這個分號;
register_globals=Off 改為 register_globals=On ,使傳遞全局變數有效;
extension=php_dba.dll 如果前面有分號,取消分號,以下同;
extension=php_dbase.dll
extension=php_gd2.dll GD庫做圖,一般用於圖形驗證碼;
extension=php_mysql.dll 用於連接MYSQL資料庫
short_open_tag=On 支持<?php…?>和<?…?>,Off為僅支持<?php…?>

復制D:\PHP\PHP目錄下的php5ts.dll和libmysql.dll(用於支持mysql)文件到windows的系統文件夾里,即:C:\windows\system32。

≡ Apache 2.2.8 的安裝 ≡
1、到其官方站點下載 apache_2.2.8-win32-x86-no_ssl.msi 並執行。
按3次Next按鈕,安裝程序要求輸入你的Network Domain(網路域名)、Server Domain(伺服器域名)和網站管理員的E-mail,有的話就如實填寫,本說明介紹的是本地自建測試環境,所以隨便一下,前兩個填 localhost ,郵件寫自己的即可。
進入Next後,默認的安裝路徑是"C:\Program Files\Apache Software Foundation\Apache2.2\",修改路徑,改為自己所要的"D:\PHP\Apache2.2"。
然後一路下去,直到安裝結束;此時,打開D盤下的PHP文件夾,可以看到有一個名為Apache2.2的文件夾。

2、打開IE,然後在地址欄輸入:"http://localhost" 或者 "http://127.0.0.1" 可以看到Apache安裝完成的成功頁面;

3、conf/httpd.conf文件的配置
1)查找「DocumentRoot」,這里是指定主頁放置的目錄。默認是:「D:\PHP\Apache2.2\htdocs」,你可以使用默認的目錄,也可以自己定義一個,如:「D:/PHP」。注意:目錄末尾不要加「/」。
2)查找「DirectoryIndex」,這里是默認首頁文件名,可以在index.html 的後面加入index.php等。多個文件名用空格分隔。
3)查找
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
修改為:
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
allow from all
</Directory>
如果不改這里的話,可能會出現 You don't have permission to access / on this server. 這樣的錯誤提示,尤其在改變了默認主頁的路徑後。

4)建立虛擬目錄
找到<IfMole alias_mole> …… </IfMole>
添加Alias /webpath "D:\PHP\Apache2.2\phptxt"
<Directory "D:\PHP\Apache2.2\phptxt">
Options MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
其中/webpath為虛擬目錄名稱,"D:\PHP\Apache2.2\phptxt"為文件存放位置。
訪問的地址為:http://localhost/webpath/

5)使伺服器支持PHP,在相應位置加入如下兩句代碼
LoadMole php5_mole "D:\PHP\PHP\php5apache2_2.dll"

AddType application/x-httpd-php .php .php3 .inc

注意:修改了httpd.conf文件,需要重啟Apache2.2才生效。

二、使用IIS解析PHP文件
1、同上,先安裝 PHP 5.2.5。
2、打開IIS管理器,選擇「默認網站」->"屬性",彈出的對話框中選擇「主目錄」先項卡,執行許可權改為「腳本和可執行文件」,點擊「配置」,添加應用程序擴展名映射,可執行文件選擇「D:\PHP\PHP\php5isapi.dll」,擴展名「.php」,並選擇全部動作、腳本引擎、確認文件是否存在。
若為win2003系統,還需要添加web服務擴展,要求的文件為「D:\PHP\PHP\php5isapi.dll」,擴展名為「PHP」,狀況改成允許。

5. 怎樣解決php頁面的載入超時問題

當PHP頁面處理大事務時,頁面往往會發生超時的錯誤,我解決此問題的方法如下:1.優化程序代碼:這種方法可能有時立竿見影,但對一些已經很優化或者第三方開發的程序,可能用處不大,但我個人覺得這個辦法還是應該優先考慮,這個一個優秀程序員必需有的工作美德。2.對多個任務進行拆分:對於一些程序,可能問題並不出現在代碼效率上,如Paypal的SOAP調用,大量時間花費在網路的數據傳遞上了,(此問題在Web Services的遠程調用時經常發生),我們當然不能等將來網速的提高來解決這個問題。其實我們可以查看一下在一個POST動作中是否包含了多個任務,如付費、發Email、發貨等等。如是這樣其實可以對這些任務進行拆分,把這個工作拆分成多個子工作來實現。如執行完付費任務時,使用PHP的Header函數重定向到發送Email的頁面,完成後再定向到其他頁面,採用redirect頁面的方式來接力地完成任務。3.進行PHP設定值的修改如果以上兩種方法仍然無法解決,代碼已經最優話,同時只有一個單任務的工作需要完成。針對這樣的情況,只能修改PHP的設定值了。不過建議不要直接修改PHP.ini,這樣會延長所有PHP執行的最大時間。簡單的方法就是使用init_set函數,以下的代碼把PHP最大執行時間設定為180秒。ini_set('max_execution_time', '180');同時可以使用ini_get把原來設置的max_execution_time保存下來,在進行完操作時回復原來的設定值。

6. 如何配置PHP的運行環境

php環境軟體建議用lnmp,也就是linux,nginx,mysql,php的這套組合。

linux伺服器能搭建網站,還比較好用。

用php面板就可以了。

是一類面板的統稱,不是具體某個面板的名字。這裡面有很多可以免費用的面板,不說牌子了免得被屏蔽,你可以去找找。

最好用可視化的面板,更適合你這樣的新手使用。

7. 幾種常見的PHP超時處理方法

【Web伺服器超時處理】

[ Apache ]
一般在性能很高的情況下,預設所有超時配置都是30秒,但是在上傳文件,或者網路速度很慢的情況下,那麼可能觸發超時操作。
目前apachefastcgiphp-fpm模式下有三個超時設置:
fastcgi超時設置:
修改的fastcgi連接配置,類似如下:

復制代碼 代碼如下:

<IfMolemod_fastcgi.c>
FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock
ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"
AddHandlerphp-fastcgi.php
Actionphp-fastcgi/fcgi-bin/php-cgi
AddTypeapplication/x-
</IfMole>

預設配置是30s,如果需要定製自己的配置,需要修改配置,比如修改為100秒:(修改後重啟apache):

復制代碼 代碼如下:

<IfMolemod_fastcgi.c>
FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock-idle-timeout100
ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"
AddHandlerphp-fastcgi.php
Actionphp-fastcgi/fcgi-bin/php-cgi
AddTypeapplication/x-
</IfMole>

如果超時會返回500錯誤,斷開跟後端php服務的連接,同時記錄一條apache錯誤日誌:
[ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:commwithserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"aborted:idletimeout(30sec)
[ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:incompleteheaders(0bytes)receivedfromserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"
其他fastcgi配置參數說明:
復制代碼 代碼如下:

IdleTimeout發呆時限
ProcessLifeTime一個進程的最長生命周期,過期之後無條件kill
MaxProcessCount最大進程個數
DefaultMinClassProcessCount每個程序啟動的最小進程個數
DefaultMaxClassProcessCount每個程序啟動的最大進程個數
IPCConnectTimeout程序響應超時時間
IPCCommTimeout與程序通訊的最長時間,上面的錯誤有可能就是這個值設置過小造成的
MaxRequestsPerProcess每個進程最多完成處理個數,達成後自殺

[ Lighttpd ]
配置:lig
Lighttpd配置中,關於超時的參數有如下幾個(篇幅考慮,只寫讀超時,寫超時參數同理):
主要涉及選項:
server.max-keep-alive-idle=5
server.max-read-idle=60
server.read-timeout=0
server.max-connection-idle=360
復制代碼 代碼如下:

#每次keep-alive的最大請求數,默認值是16
server.max-keep-alive-requests=100
#keep-alive的最長等待時間,單位是秒,默認值是5
server.max-keep-alive-idle=1200
#lighttpd的work子進程數,默認值是0,單進程運行
server.max-worker=2
#限制用戶在發送請求的過程中,最大的中間停頓時間(單位是秒),
#如果用戶在發送請求的過程中(沒發完請求),中間停頓的時間太長,lighttpd會主動斷開連接
#默認值是60(秒)
server.max-read-idle=1200
#限制用戶在接收應答的過程中,最大的中間停頓時間(單位是秒),
#如果用戶在接收應答的過程中(沒接完),中間停頓的時間太長,lighttpd會主動斷開連接
#默認值是360(秒)
server.max-write-idle=12000
#讀客戶端請求的超時限制,單位是秒,配為0表示不作限制
#設置小於max-read-idle時,read-timeout生效
server.read-timeout=0
#寫應答頁面給客戶端的超時限制,單位是秒,配為0表示不作限制
#設置小於max-write-idle時,write-timeout生效
server.write-timeout=0
#請求的處理時間上限,如果用了mod_proxy_core,那就是和後端的交互時間限制,單位是秒
server.max-connection-idle=1200

說明:
對於一個keep-alive連接上的連續請求,發送第一個請求內容的最大間隔由參數max-read-idle決定,從第二個請求起,發送請求內容的最大間隔由參數max-keep-alive-idle決定。請求間的間隔超時也由max-keep-alive-idle決定。發送請求內容的總時間超時由參數read-timeout決定。Lighttpd與後端交互數據的超時由max-connection-idle決定。
延伸閱讀:

[ Nginx ]
配置:nf
復制代碼 代碼如下:

http{
#Fastcgi:(針對後端的fastcgi生效,fastcgi不屬於proxy模式)
fastcgi_connect_timeout5;#連接超時
fastcgi_send_timeout10; #寫超時
fastcgi_read_timeout10;#讀取超時
#Proxy:(針對proxy/upstreams的生效)
proxy_connect_timeout15s;#連接超時
proxy_read_timeout24s;#讀超時
proxy_send_timeout10s; #寫超時
}

說明:
Nginx 的超時設置倒是非常清晰容易理解,上面超時針對不同工作模式,但是因為超時帶來的問題是非常多的。
延伸閱讀:
ml
ml
ml

【PHP本身超時處理】
[ PHP-fpm ]
配置:nf
復制代碼 代碼如下:

<?xmlversion="1.0"?>
<configuration>
//...
.
.
EquivalenttoPHP_FCGI_.fcgi
Usedwithanypm_style.
#php-cgi的進程數量
<valuename="max_children">128</value>
Thetimeout(inseconds)
Shouldbeusedwhen'max_execution_time'
'0s'means'off'
#php-fpm 請求執行超時時間,0s為永不超時,否則設置一個 Ns 為超時的秒數
<valuename="request_terminate_timeout">0s</value>
Thetimeout(inseconds).logfile
'0s'means'off'
<valuename="request_slowlog_timeout">0s</value>
</configuration>

說明:
在php.ini中,有一個參數max_execution_time可以設置PHP腳本的最大執行時間,但是,在php-cgi(php-fpm)中,該參數不會起效。真正能夠控制PHP腳本最大執行時:
<valuename="request_terminate_timeout">0s</value>
就是說如果是使用mod_php5.so的模式運行max_execution_time是會生效的,但是如果是php-fpm模式中運行時不生效的。
延伸閱讀:

[ PHP ]
配置:php.ini
選項:
max_execution_time=30
或者在代碼里設置:
ini_set("max_execution_time",30);
set_time_limit(30);
說明:
對當前會話生效,比如設置0一直不超時,但是如果php的safe_mode打開了,這些設置都會不生效。
效果一樣,但是具體內容需要參考php-fpm部分內容,如果php-fpm中設置了request_terminate_timeout的話,那麼max_execution_time就不生效。
【後端&介面訪問超時】
【HTTP訪問】
一般我們訪問HTTP方式很多,主要是:curl,socket,file_get_contents()等方法。
如果碰到對方伺服器一直沒有響應的時候,我們就悲劇了,很容易把整個伺服器搞死,所以在訪問http的時候也需要考慮超時的問題。
[ CURL 訪問HTTP]
CURL 是我們常用的一種比較靠譜的訪問HTTP協議介面的lib庫,性能高,還有一些並發支持的功能等。
CURL:
curl_setopt($ch,opt)可以設置一些超時的設置,主要包括:
*(重要)CURLOPT_TIMEOUT設置cURL允許執行的最長秒數。
*(重要)CURLOPT_TIMEOUT_MS設置cURL允許執行的最長毫秒數。(在cURL7.16.2中被加入。從PHP5.2.3起可使用。)
CURLOPT_CONNECTTIMEOUT在發起連接前等待的時間,如果設置為0,則無限等待。
CURLOPT_CONNECTTIMEOUT_MS嘗試連接等待的時間,以毫秒為單位。如果設置為0,則無限等待。在cURL7.16.2中被加入。從PHP5.2.3開始可用。
CURLOPT_DNS_CACHE_TIMEOUT設置在內存中保存DNS信息的時間,默認為120秒。
curl普通秒級超時:
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_TIMEOUT,60);//只需要設置一個秒的數量就可以
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch,CURLOPT_USERAGENT,$defined_vars['HTTP_USER_AGENT']);
curl普通秒級超時使用:
curl_setopt($ch,CURLOPT_TIMEOUT,60);
curl如果需要進行毫秒超時,需要增加:
curl_easy_setopt(curl,CURLOPT_NOSIGNAL,1L);
或者是:
curl_setopt($ch,CURLOPT_NOSIGNAL,true);是可以支持毫秒級別超時設置的
curl一個毫秒級超時的例子:
復制代碼 代碼如下:

<?php
if(!isset($_GET['foo'])){
//Client
$ch=curl_init('');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_NOSIGNAL,1);//注意,毫秒超時一定要設置這個
curl_setopt($ch,CURLOPT_TIMEOUT_MS,200);//超時毫秒,cURL7.16.2中被加入。從PHP5.2.3起可使用
$data=curl_exec($ch);
$curl_errno=curl_errno($ch);
$curl_error=curl_error($ch);
curl_close($ch);
if($curl_errno>0){
echo"cURLError($curl_errno):$curl_errorn";
}else{
echo"Datareceived:$datan";
}
}else{
//Server
sleep(10);
echo"Done.";
}
?>

其他一些技巧:
1. 按照經驗總結是:cURL版本>=libcurl/7.21.0版本,毫秒級超時是一定生效的,切記。
2. curl_multi的毫秒級超時也有問題。。單次訪問是支持ms級超時的,curl_multi並行調多個會不準
[流處理方式訪問HTTP]
除了curl,我們還經常自己使用fsockopen、或者是file操作函數來進行HTTP協議的處理,所以,我們對這塊的超時處理也是必須的。
一般連接超時可以直接設置,但是流讀取超時需要單獨處理。
自己寫代碼處理:
復制代碼 代碼如下:

$tmCurrent=gettimeofday();
$intUSGone=($tmCurrent['sec']-$tmStart['sec'])*1000000
+($tmCurrent['usec']-$tmStart['usec']);
if($intUSGone>$this->_intReadTimeoutUS){
returnfalse;
}

或者使用內置流處理函數stream_set_timeout()和stream_get_meta_data()處理:
復制代碼 代碼如下:

<?php
//Timeoutinseconds
$timeout=5;
$fp=fsockopen("",80,$errno,$errstr,$timeout);
if($fp){
fwrite($fp,"GET/HTTP/1.0rn");
fwrite($fp,"Host:rn");
fwrite($fp,"Connection:Closernrn");
stream_set_blocking($fp,true);//重要,設置為非阻塞模式
stream_set_timeout($fp,$timeout);//設置超時
$info=stream_get_meta_data($fp);
while((!feof($fp))&&(!$info['timed_out'])){
$data.=fgets($fp,4096);
$info=stream_get_meta_data($fp);
ob_flush;
flush();
}
if($info['timed_out']){
echo"ConnectionTimedOut!";
}else{
echo$data;
}
}

file_get_contents超時:
復制代碼 代碼如下:

<?php
$timeout=array(
'http'=>array(
'timeout'=>5//設置一個超時時間,單位為秒
)
);
$ctx=stream_context_create($timeout);
$text=file_get_contents("",0,$ctx);
?>

fopen超時:
復制代碼 代碼如下:

<?php
$timeout=array(
'http'=>array(
'timeout'=>5//設置一個超時時間,單位為秒
)
);
$ctx=stream_context_create($timeout);
if($fp=fopen("","r",false,$ctx)){
while($c=fread($fp,8192)){
echo$c;
}
fclose($fp);
}
?>

【MySQL】
php中的mysql客戶端都沒有設置超時的選項,mysqli和mysql都沒有,但是libmysql是提供超時選項的,只是我們在php中隱藏了而已。
那麼如何在PHP中使用這個操作捏,就需要我們自己定義一些MySQL操作常量,主要涉及的常量有:
MYSQL_OPT_READ_TIMEOUT=11;
MYSQL_OPT_WRITE_TIMEOUT=12;
這兩個,定義以後,可以使用options設置相應的值。
不過有個注意點,mysql內部實現:
1.超時設置單位為秒,最少配置1秒
2.但mysql底層的read會重試兩次,所以實際會是3秒
重試兩次+自身一次=3倍超時時間,那麼就是說最少超時時間是3秒,不會低於這個值,對於大部分應用來說可以接受,但是對於小部分應用需要優化。
查看一個設置訪問mysql超時的php實例:
復制代碼 代碼如下:

<?php
//自己定義讀寫超時常量
if(!defined('MYSQL_OPT_READ_TIMEOUT')){
define('MYSQL_OPT_READ_TIMEOUT',11);
}
if(!defined('MYSQL_OPT_WRITE_TIMEOUT')){
define('MYSQL_OPT_WRITE_TIMEOUT',12);
}
//設置超時
$mysqli=mysqli_init();
$mysqli->options(MYSQL_OPT_READ_TIMEOUT,3);
$mysqli->options(MYSQL_OPT_WRITE_TIMEOUT,1);
//連接資料庫
$mysqli->real_connect("localhost","root","root","test");
if(mysqli_connect_errno()){
printf("Connectfailed:%s/n",mysqli_connect_error());
exit();
}
//執行查詢sleep1秒不超時
printf("Hostinformation:%s/n",$mysqli->host_info);
if(!($res=$mysqli->query('selectsleep(1)'))){
echo"query1error:".$mysqli->error."/n";
}else{
echo"Query1:querysuccess/n";
}
//執行查詢sleep9秒會超時
if(!($res=$mysqli->query('selectsleep(9)'))){
echo"query2error:".$mysqli->error."/n";
}else{
echo"Query2:querysuccess/n";
}
$mysqli->close();
echo"closemysqlconnection/n";
?>

延伸閱讀:

【Memcached】
[PHP擴展]
php_memcache客戶端:
連接超時:boolMemcache::connect(string$host[,int$port[,int$timeout]])
在get和set的時候,都沒有明確的超時設置參數。
libmemcached客戶端:在php介面沒有明顯的超時參數。
說明:所以說,在PHP中訪問Memcached是存在很多問題的,需要自己hack部分操作,或者是參考網上補丁。
[C&C++訪問Memcached]
客戶端:libmemcached客戶端
說明:memcache超時配置可以配置小點,比如5,10個毫秒已經夠用了,超過這個時間還不如從資料庫查詢。
下面是一個連接和讀取set數據的超時的C++示例:
復制代碼 代碼如下:

//創建連接超時(連接到Memcached)
memcached_st*MemCacheProxy::_create_handle()
{
memcached_st*mmc=NULL;
memcached_return_tprc;
if(_mpool!=NULL){//getfrompool
mmc=memcached_pool_pop(_mpool,false,&prc);
if(mmc==NULL){
__LOG_WARNING__("MemCacheProxy","gethandlefrompoolerror[%d]",(int)prc);
}
returnmmc;
}
memcached_st*handle=memcached_create(NULL);
if(handle==NULL){
__LOG_WARNING__("MemCacheProxy","create_handleerror");
returnNULL;
}
//設置連接/讀取超時
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_HASH,MEMCACHED_HASH_DEFAULT);
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_NO_BLOCK,_noblock);//參數MEMCACHED_BEHAVIOR_NO_BLOCK為1使超時配置生效,不設置超時會不生效,關鍵時候會悲劇的,容易引起雪崩
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT,_connect_timeout);//連接超時
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_RCV_TIMEOUT,_read_timeout);//讀超時
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_SND_TIMEOUT,_send_timeout);//寫超時
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_POLL_TIMEOUT,_poll_timeout);
//設置一致hash
//memcached_behavior_set_distribution(handle,MEMCACHED_DISTRIBUTION_CONSISTENT);
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_DISTRIBUTION,MEMCACHED_DISTRIBUTION_CONSISTENT);
memcached_returnrc;
for(uinti=0;i<_server_count;i++){
rc=memcached_server_add(handle,_ips[i],_ports[i]);
if(MEMCACHED_SUCCESS!=rc){
__LOG_WARNING__("MemCacheProxy","addserver[%s:%d]failed.",_ips[i],_ports[i]);
}
}
_mpool=memcached_pool_create(handle,_min_connect,_max_connect);
if(_mpool==NULL){
__LOG_WARNING__("MemCacheProxy","create_poolerror");
returnNULL;
}
mmc=memcached_pool_pop(_mpool,false,&prc);
if(mmc==NULL){
__LOG_WARNING__("MyMemCacheProxy","gethandlefrompoolerror[%d]",(int)prc);
}
//__LOG_DEBUG__("MemCacheProxy","gethandle[%p]",handle);
returnmmc;
}
//設置一個key超時(set一個數據到memcached)
boolMemCacheProxy::_add(memcached_st*handle,unsignedint*key,constchar*value,intlen,unsignedinttimeout)
{
memcached_returnrc;
chartmp[1024];
snprintf(tmp,sizeof(tmp),"%u#%u",key[0],key[1]);
//有個timeout值
rc=memcached_set(handle,tmp,strlen(tmp),(char*)value,len,timeout,0);
if(MEMCACHED_SUCCESS!=rc){
returnfalse;
}
returntrue;
}

//Memcache讀取數據超時(沒有設置)
libmemcahed源碼中介面定義:
LIBMEMCACHED_APIchar*memcached_get(memcached_st*ptr,constchar*key,size_tkey_length,size_t*value_length,uint32_t*flags,memcached_return_t*error);
LIBMEMCACHED_APImemcached_return_tmemcached_mget(memcached_st*ptr,constchar*const*keys,constsize_t*key_length,size_tnumber_of_keys);
從介面中可以看出在讀取數據的時候,是沒有超時設置的。
延伸閱讀:

【如何實現超時】
程序中需要有超時這種功能,比如你單獨訪問一個後端Socket模塊,Socket模塊不屬於我們上面描述的任何一種的時候,它的協議也是私有的,那麼這個時候可能需要自己去實現一些超時處理策略,這個時候就需要一些處理代碼了。
[PHP中超時實現]
一、初級:最簡單的超時實現 (秒級超時)
思路很簡單:鏈接一個後端,然後設置為非阻塞模式,如果沒有連接上就一直循環,判斷當前時間和超時時間之間的差異。
phpsocket中實現原始的超時:(每次循環都當前時間去減,性能會很差,cpu佔用會較高)
復制代碼 代碼如下:

<?
$host="127.0.0.1";
$port="80";
$timeout=15;//timeoutinseconds
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)
ordie("Unabletocreatesocketn");
socket_set_nonblock($socket) //務必設置為阻塞模式
ordie("Unabletosetnonblockonsocketn");
$time=time();
//循環的時候每次都減去相應值
while(!@socket_connect($socket,$host,$port))//如果沒有連接上就一直死循環
{
$err=socket_last_error($socket);
if($err==115||$err==114)
{
if((time()-$time)>=$timeout)//每次都需要去判斷一下是否超時了
{
socket_close($socket);
die("Connectiontimedout.n");
}
sleep(1);
continue;
}
die(socket_strerror($err)."n");
}
socket_set_block($this->socket)//還原阻塞模式
ordie("Unabletosetblockonsocketn");
?>

二、升級:使用PHP自帶非同步IO去實現(毫秒級超時)
說明:
非同步IO:非同步IO的概念和同步IO相對。當一個非同步過程調用發出後,調用者不能立刻得到結果。實際處理這個調用的部件在完成後,通過狀態、通知和回調來通知調用者。非同步IO將比特分成小組進行傳送,小組可以是8位的1個字元或更長。發送方可以在任何時刻發送這些比特組,而接收方從不知道它們會在什麼時候到達。
多路復用:復用模型是對多個IO操作進行檢測,返回可操作集合,這樣就可以對其進行操作了。這樣就避免了阻塞IO不能隨時處理各個IO和非阻塞佔用系統資源的確定。
使用socket_select()實現超時
socket_select(...,floor($timeout),ceil($timeout*1000000));
select的特點:能夠設置到微秒級別的超時!
使用socket_select()的超時代碼(需要了解一些非同步IO編程的知識去理解)
復制代碼 代碼如下:

編程 調用類 編程#
<?php
$server=newServer;
$client=newClient;
for(;;){
foreach($select->can_read(0)as$socket){
if($socket==$client->socket){
//NewClientSocket
$select->add(socket_accept($client->socket));
}
else{
//there'ssomethingtoreadon$socket
}
}
}
?>
編程 非同步多路復用IO & 超時連接處理類 編程
<?php
classselect{
var$sockets;
functionselect($sockets){
$this->sockets=array();
foreach($socketsas$socket){
$this->add($socket);
}
}
functionadd($add_socket){
array_push($this->sockets,$add_socket);
}
functionremove($remove_socket){
$sockets=array();
foreach($this->socketsas$socket){
if($remove_socket!=$socket)
$sockets[]=$socket;
}
$this->sockets=$sockets;
}
functioncan_read($timeout){
$read=$this->sockets;
socket_select($read,$write=NULL,$except=NULL,$timeout);
return$read;
}
functioncan_write($timeout){
$write=$this->sockets;
socket_select($read=NULL,$write,$except=NULL,$timeout);
return$write;
}
}
?>

[C&C++中超時實現]
一般在LinuxC/C++中,可以使用:alarm()設置定時器的方式實現秒級超時,或者:select()、poll()、epoll()之類的非同步復用IO實現毫秒級超時。也可以使用二次封裝的非同步io庫(libevent,libev)也能實現。
一、使用alarm中用信號實現超時 (秒級超時)
說明:Linux內核connect超時通常為75秒,我們可以設置更小的時間如10秒來提前從connect中返回。這里用使用信號處理機制,調用alarm,超時後產生SIGALRM信號(也可使用select實現)
用alarym秒級實現connect設置超時代碼示例:
復制代碼 代碼如下:

//信號處理函數
staticvoidconnect_alarm(intsigno)
{
debug_printf("SignalHandler");
return;
}
//alarm超時連接實現
staticvoidconn_alarm()
{
Sigfunc*sigfunc;//現有信號處理函數
sigfunc=signal(SIGALRM,connect_alarm);//建立信號處理函數connect_alarm,(如果有)保存現有的信號處理函數
inttimeout=5;
//設置鬧鍾
if(alarm(timeout)!=0){
//...鬧鍾已經設置處理
}
//進行連接操作
if(connect(m_Socket,(structsockaddr*)&addr,sizeof(addr))<0){
if(errno==EINTR){//如果錯誤號設置為EINTR,說明超時中斷了
debug_printf("Timeout");

8. php.ini-development和php.ini-proction的區別

development 是開發模式 ,
proction 是經營模式。
主要是參數優化不一樣。

9. [求助]php環境配置問題

一、下載地址:

Apache2.0.50 :http://httpd.apache.org/download.cgi

PHP5.0.2 :http://cn2.php.net/get/php-5.0.2-Win32.zip/from/a/mirror

MYSQL5.0.2:http://dev.mysql.com/downloads/mysql/5.0.html

Zend2.5.2 :http://www.zend.com/store/free_download.php?pid=13]

軟體的安裝偶就不說了,其中只有PHP下的是zip包,直接解壓就可以了。

安裝順序就是上面列出來的順序,Zend我是最後等所有的運行都沒問題後才裝的。

二、簡單安裝過程:

(一)Apache:

Apache2.0.50的安裝很簡單,我就直接把他裝到了E盤根目錄下(我C盤是系統盤,D盤是temp盤,偶發現在windows下單獨拿個分區來做臨時文件的存放地對系統的速度影響不小,這樣做能提升系統運行的速度,感興趣的朋友可以試試看),安裝完後我的apache目錄就是E:\apache2

(二)PHP:

我是直接解壓縮放到E盤php目錄下了,這樣查找文件會方便許多。

(三)Mysql:

直接裝到E:\mysql下,它的默認目錄太長,是在C盤下的,偶的C盤是除windows的文件外別的一概不放的。

(四)Zend:

所有的調試都正常後我把Zend裝到了E:\program files\zend下

三、配置過程:

(一)http.conf

這個文件我改了幾個地方:

把PHP直接作為apache的一個模塊運行,我在裡面加了兩句:

CODE: [Copy to clipboard]

LoadMole php5_mole "E:/php/php5apache2.dll"

AddType application/x-httpd-php .php

我在E:\apache2目錄下建立了一個www的目錄用於存放我的站點文件,在http.conf里改了這樣一句話:

把DocumentRoot "E:/Apache2/htdocs"改成了DocumentRoot "E:/Apache2/www"

Apache2.0.x於1.3.x相比2.0.x默認不能直接列目錄,偶感覺不爽,就改了:

把DocumentRoot "E:/Apache2/www"這句下的如下語句

CODE: [Copy to clipboard]

Options FollowSymLinks

AllowOverride None

改為:

CODE: [Copy to clipboard]

Options Indexes FollowSymLinks
AllowOverride None

把apache的默認字元設置為中文簡體:

AddDefaultCharset GB2312

修改目錄的默認首頁:

DirectoryIndex 後面寫上你想設置為首頁的文件名,如:index.html index.php等

別的就沒再動什麼地方

注意一點的是,要使這些配置生效需要重新啟動apache

(二)php.ini

以前用php4.x的時候覺得配置起來很簡單,所以偶用PHP5也直接那麼配了,誰知道完了mysql不能用,說是無法連接動態庫,我仔細檢查了一下 php_mysql.dll明明存在,可就說找不到,這點讓我郁悶了N久,偶重新解壓了php5也沒用,後來在php的install文檔里發現了這么一句話: php_mysql.dll MySQL functions PHP >= 5.0.0, requires libmysql.dll (bundled)

於是偶才找到了原因......

配置php5.0.2是這樣來過的:

把php.ini-dist復制到C:\windows 下改名為 php.ini(裝過php的都做過吧)

然後修改了幾個地方:

extension_dir = "E:\php\ext" (指定動態連接庫的目錄,php5和php4不同的地方就是它的動態連接庫目錄變了,這在它的文檔結構里有詳細的說明)

然後把下面幾句前面的分號去掉

;extension=php_dba.dll

;extension=php_dbase.dll

;extension=php_filepro.dll

;extension=php_gd2.dll

;extension=php_imap.dll

;extension=php_mysql.dll

接下來修改了一些文件上傳以及內存使用最大限制:

memory_limit = 20M

post_max_size = 20M

upload_max_filesize = 20M

別的就沒改什麼了,這里修改過php.ini以後也要重新啟動apache

接下來一點很重要的就是把php目錄下的 libmysql.dll 和 libmysqli.dll 復制到windows/system32下,如果不這樣做,mysql動態連接庫就無法正常載入。

接下來一點很重要的就是把mysql目錄下的 libmysql.dll 復制到apache/bin下,如果不這樣做,mysql動態連接庫就無法正常載入。
接下來一點很重要的就是把php目錄下的 php5apache2.dll和php5ts.dll 復制到apache/bin下,如果不這樣做,mysql動態連接庫就無法正常載入。

將apache/bin下的libmysql.dll php5apache2.dll php5ts.dll考到windows/system32 下

10. windows怎麼安裝php-fpm 優化

php5與apache2.0配置方法 一.php的安裝與調試 由於php是一個zip文件(非install版),安裝較為簡單,解壓就行。把解壓的 php5.2.1-Win32重命名為 php5。 1 找到php目錄下的 php.ini-dist或 php.ini.recommended文件,重命名為 php.ini 並復制到系統盤的windows目錄下(以c:\windows為例). 2 再把php目錄下的php5ts.dll,libmysql.dll復制到目錄 c:\windows\system32下。 3 把php5\ext目錄下的php_gd2.dll,php_mysql.dll,php_mbstring.dll文件復制到c:\windows\system32下 如果沒有載入 php_gd2.dll php將不能處理圖像。沒有載入php_mysql.dll php將不支持mysql函數庫 php_mbstring.dll在後面使用phpmyadmin時支持寬字元。 4 打開c:\windows\php.ini文件(關聯到mysql) 設置擴展路徑 查找 extension_dir 有這么一行extension_dir = "./" 將此行改成 extension_dir = "C:\php5\ext" 其中C:\php5是你安裝php的路徑。路徑不正確將無法載入dll (注意:有些php版本是 ;extension_dir = "./" 要把前面的分號去掉) 查找 extension extension=php_mbstring.dll extension=php_gd2.dll extension=php_mysql.dll 把上面3項前面的分號去掉,這樣apache啟動時就可以載入這些dll了 當然前面我們也把這些dll復制到system32下了l php5時差問題 <?php echo date("Y-m-d H:i:s");?>時間相差八小時 為什麼呢?PHP5系列版本新增了時區設置,默認為格林威治時間,與中國所在的東8區正好相差8個小時 查找date.timezone有這么一行 ;date.timezone = 將;去掉,改成 date.timezone = PRC 二:在httpd.conf的最後一行寫下 LoadMole php5_mole D:/php5/php5apache2.dll PHPIniDir "C:/WINDOWS" AddType application/x-httpd-php .php AddType application/x-httpd-php .html AddType application/x-httpd-php .htm Alias /aa "D:/aa/" <Directory "D:/aa"> Options Indexes MultiViews AllowOverride none Order allow,deny

熱點內容
解壓玩具怎麼做只用水就可以做 發布:2025-07-01 20:52:56 瀏覽:160
解壓放鬆室 發布:2025-07-01 20:52:43 瀏覽:124
存儲器壞了 發布:2025-07-01 20:46:11 瀏覽:510
iphone怎麼設鎖屏密碼 發布:2025-07-01 20:46:10 瀏覽:620
伺服器如何處理千萬請求 發布:2025-07-01 20:30:53 瀏覽:332
plsqldeveloperjob 發布:2025-07-01 20:29:59 瀏覽:804
剪切文件用什麼配置 發布:2025-07-01 20:23:07 瀏覽:44
酷睿2020主要看哪些配置 發布:2025-07-01 20:23:06 瀏覽:261
sql保存文件 發布:2025-07-01 20:18:52 瀏覽:802
安卓做的登錄頁面怎麼運行 發布:2025-07-01 20:18:48 瀏覽:813