㈠ php讀取文本文件內容~
示例代碼1: 用file_get_contents 以get方式獲取內容
代碼如下:
<?php
$url='';
$html=file_get_contents($url);
//print_r($http_response_header);
ec($html);
printhr();
printarr($http_response_header);
printhr();
?>
示例代碼2: 用fopen打開url, 以get方式獲取內容
代碼如下:
<?
$fp=fopen($url,'r');
printarr(stream_get_meta_data($fp));
printhr();
while(!feof($fp)){
$result.=fgets($fp,1024);
}
echo"url body:$result";
printhr();
fclose($fp);
?>
示例代碼3:用file_get_contents函數,以post方式獲取url
代碼如下:
<?php
$data=array('foo'=>'bar');
$data=http_build_query($data);
$opts=array(
'http'=>array(
'method'=>'POST',
'header'=>"Content-type: application/x-www-form-urlencodedrn".
"Content-Length: ".strlen($data)."rn",
'content'=>$data
),
);
$context=stream_context_create($opts);
$html=file_get_contents('',false,$context);
echo$html;
?>
示例代碼4:用fsockopen函數打開url,以get方式獲取完整的數據,包括header和body
代碼如下:
<?
functionget_url($url,$cookie=false){
$url=parse_url($url);
$query=$url[path]."?".$url[query];
ec("Query:".$query);
$fp=fsockopen($url[host],$url[port]?$url[port]:80,$errno,$errstr,30);
if(!$fp){
returnfalse;
}else{
$request="GET$queryHTTP/1.1rn";
$request.="Host:$url[host]rn";
$request.="Connection: Closern";
if($cookie)$request.="Cookie:$cookien";
$request.="rn";
fwrite($fp,$request);
while(!@feof($fp)){
$result.=@fgets($fp,1024);
}
fclose($fp);
return$result;
}
}
//獲取url的html部分,去掉header
functionGetUrlHTML($url,$cookie=false){
$rowdata=get_url($url,$cookie);
if($rowdata)
{
$body=stristr($rowdata,"rnrn");
$body=substr($body,4,strlen($body));
return$body;
}
returnfalse;
}
?>
示例代碼5:用fsockopen函數打開url,以POST方式獲取完整的數據,包括header和body
代碼如下:
<?
functionHTTP_Post($URL,$data,$cookie,$referrer=""){
// parsing the given URL
$URL_Info=parse_url($URL);
// Building referrer
if($referrer=="")// if not given use this script. as referrer
$referrer="111";
// making string from $data
foreach($dataas$key=>$value)
$values[]="$key=".urlencode($value);
$data_string=implode("&",$values);
// Find out which port is needed - if not given use standard (=80)
if(!isset($URL_Info["port"]))
$URL_Info["port"]=80;
// building POST-request:
$request.="POST ".$URL_Info["path"]." HTTP/1.1n";
$request.="Host: ".$URL_Info["host"]."n";
$request.="Referer:$referern";
$request.="Content-type: application/x-www-form-urlencodedn";
$request.="Content-length: ".strlen($data_string)."n";
$request.="Connection: closen";
$request.="Cookie:$cookien";
$request.="n";
$request.=$data_string."n";
$fp=fsockopen($URL_Info["host"],$URL_Info["port"]);
fputs($fp,$request);
while(!feof($fp)){
$result.=fgets($fp,1024);
}
fclose($fp);
return$result;
}
printhr();
?>
示例代碼6:使用curl庫,使用curl庫之前,你可能需要查看一下php.ini,查看是否已經打開了curl擴展
代碼如下:
<?
$ch = curl_init();
$timeout = 5;
curl_setopt ($ch, CURLOPT_URL, '');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
echo $file_contents;
?>
關於curl庫:
curl官方網站
curl 是使用URL語法的傳送文件工具,支持FTP、FTPS、HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAP。curl 支持SSL證書、HTTP POST、HTTP PUT 、FTP 上傳,kerberos、基於HTT格式的上傳、代理、cookie、用戶+口令證明、文件傳送恢復、http代理通道和大量其他有用的技巧
代碼如下:
<?
functionprintarr(array$arr)
{
echo"<br> Row field count: ".count($arr)."<br>";
foreach($arras$key=>$value)
{
echo"$key=$value <br>";
}
}
?>
㈡ php中如何讀取環境變數
PHP中的環境變數可以通過 $_SERVER 獲取
$_SERVER是一個包含伺服器端相關信息的PHP全局環境變數,在PHP4.1.0之前的版本使用$HTTP_SERVER_VARS。
下面是詳細的說明及用法:
$_SERVER['PHP_SELF'] 當前正在執行腳本的文件名,與 document root相關。在FORM表單中,如執行文件是本身,你可以在ACTION中使用$_SERVER['PHP_SELF'],好處是當執行文件名有變動時可以不去頻繁替換ACTION中的文件名。
$_SERVER['SERVER_NAME'] 當前運行的PHP程序所在伺服器主機的名稱。
$_SERVER['REQUEST_METHOD'] 訪問頁面時的請求方法,即GET、HEAD、POST、PUT。
$_SERVER['DOCUMENT_ROOT'] 當前運行的PHP程序所在的文檔根目錄。也就是PHP.INI文件中的定義。
$_SERVER['HTTP_REFERER'] 鏈接到當前頁面的前一頁面的URL地址。在頁面跳轉功能中非常有用。
$_SERVER['REMOTE_ADDR'] 正在瀏覽當前頁面訪問者的IP地址。
$_SERVER['REMOTE_HOST'] 正在瀏覽當前頁面用戶的主機名。
$_SERVER['REMOTE_PORT'] 正在游覽的用戶連接到伺服器時所使用的埠。
$_SERVER['SCRIPT_FILENAME'] 當前執行腳本的絕對路徑名。
$_SERVER['SERVER_PORT'] 伺服器所使用的埠
$_SERVER['SCRIPT_NAME'] 包含當前腳本的路徑。這在頁面需要指向自己時非常有用。
$_SERVER['REQUEST_URI'] 訪問此頁面所需的URI。如「/index.html」。
$_SERVER['PHP_AUTH_USER'] 應用在HTTP用戶登錄認證功能中,這個變數是用戶輸入的用戶名。
$_SERVER['PHP_AUTH_PW'] 應用在HTTP用戶登錄認證功能中,這個變數便是用戶輸入的密碼。
$_SERVER['AUTH_TYPE'] 應用在HTTP用戶登錄認證功能中,這個變數便是認證的類型。
備註:上述提到的這些PHP全局環境變數,在php.ini中的register_globals設置為on時,這些變數在所有PHP程序腳本中都可用,也就是$_SERVER數組被分離了。當然為了安全考慮,還是不要將register_globals打開為好。
㈢ 怎麼在php.ini中增加調用棧
一,php-fpm的啟動參數二,php-fpm.conf重要參數詳解#pid設置,默認在安裝目錄中的var/run/php-fpm.pid,建議開啟#錯誤日誌,默認在安裝目錄中的var/log/php-fpm.log#表示在emergency_restart_interval所設值內出現SIGSEGV或者SIGBUS錯誤的php-cgi進程數如果超過 emergency_restart_threshold個,php-fpm就會優雅重啟。這兩個選項一般保持默認值。#後台執行fpm,默認值為yes,如果為了調試可以改為no。在FPM中,可以使用不同的設置來運行多個進程池。 這些設置可以針對每個進程池單獨設置。#fpm監聽埠,即nginx中php處理的地址,一般默認值即可。可用格式為: 'ip:port', 'port', '/path/to/unix/socket'. 每個進程池都需要設置.#backlog數,-1表示無限制,由操作系統決定,此行注釋掉就行。backlog含義參考:#允許訪問FastCGI進程的IP,設置any為不限制IP,如果要設置其他主機的nginx也能訪問這台FPM進程,listen處要設置成本地可被訪問的IP。默認值是any。每個地址是用逗號分隔. 如果沒有設置或者為空,則允許任何伺服器請求連接#unix socket設置選項,如果使用tcp方式訪問,這里注釋即可。pm = dynamic #對於專用伺服器,pm可以設置為static。#如何控制子進程,選項有static和dynamic。如果選擇static,則由pm.max_children指定固定的子進程數。如果選擇dynamic,則由下開參數決定:pm.max_children #,子進程最大數pm.start_servers #,啟動時的進程數pm.min_spare_servers #,保證空閑進程數最小值,如果空閑進程小於此值,則創建新的子進程pm.max_spare_servers #,保證空閑進程數最大值,如果空閑進程大於此值,此進行清理#FPM監控頁面的ping網址. 如果沒有設置, 則無法訪問ping頁面. 該頁面用於外部檢測FPM是否存活並且可以響應請求. 請注意必須以斜線開頭 (/)。#設置單個請求的超時中止時間. 該選項可能會對php.ini設置中的'max_execution_time'因為某些特殊原因沒有中止運行的腳本有用. 設置為 '0' 表示 'Off'.當經常出現502錯誤時可以嘗試更改此選項。#當一個請求該設置的超時時間後,就會將對應的PHP調用堆棧信息完整寫入到慢日誌中. 設置為 '0' 表示 'Off'#設置文件打開描述符的rlimit限制. 默認值: 系統定義值默認可打開句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。#設置啟動目錄,啟動時會自動Chdir到該目錄. 所定義的目錄需要是絕對路徑. 默認值: 當前目錄,或者/目錄(chroot時)三,常見錯誤及解決辦法整理1,request_terminate_timeout的值如果設置為0或者過長的時間,可能會引起file_get_contents的資源問題。如果file_get_contents請求的遠程資源如果反應過慢,file_get_contents就會一直卡在那裡不會超時,我們知道php.ini 裡面max_execution_time 可以設置 PHP 腳本的最大執行時間,但是,在 php-cgi(php-fpm) 中,該參數不會起效。真正能夠控制 PHP 腳本最大執行時間的是 php-fpm.conf 配置文件中的request_terminate_timeout參數。request_terminate_timeout默認值為 0 秒,也就是說,PHP 腳本會一直執行下去。這樣,當所有的 php-cgi 進程都卡在 file_get_contents() 函數時,這台 Nginx+PHP 的 WebServer 已經無法再處理新的 PHP 請求了,Nginx 將給用戶返回「502 Bad Gateway」。修改該參數,設置一個 PHP 腳本最大執行時間是必要的,但是,治標不治本。例如改成 30s,如果發生 file_get_contents() 獲取網頁內容較慢的情況,這就意味著 150 個 php-cgi 進程,每秒鍾只能處理 5 個請求,WebServer 同樣很難避免"502 Bad Gateway"。解決辦法是request_terminate_timeout設置為10s或者一個合理的值,或者給file_get_contents加一個超時參數。'timeout' => 10 //設置一個超時時間,單位為秒2,max_requests參數配置不當,可能會引起間歇性502錯誤:這段配置的意思是,當一個 PHP-CGI 進程處理的請求數累積到 500 個後,自動重啟該進程。一般在項目中,我們多多少少都會用到一些 PHP 的第三方庫,這些第三方庫經常存在內存泄漏問題,如果不定期重啟 PHP-CGI 進程,勢必造成內存使用量不斷增長。因此 PHP-FPM 作為 PHP-CGI 的管理器,提供了這么一項監控功能,對請求達到指定次數的 PHP-CGI 進程進行重啟,保證內存使用量不增長。正是因為這個機制,在高並發的站點中,經常導致 502 錯誤,我猜測原因是 PHP-FPM 對從 NGINX 過來的請求隊列沒處理好。不過我目前用的還是 PHP 5.3.2,不知道在 PHP 5.3.3 中是否還存在這個問題。目前我們的解決方法是,把這個值盡量設置大些,盡可能減少 PHP-CGI 重新 SPAWN 的次數,同時也能提高總體性能。在我們自己實際的生產環境中發現,內存泄漏並不明顯,因此我們將這個值設置得非常大(204800)。大家要根據自己的實際情況設置這個值,不能盲目地加大。話說回來,這套機制目的只為保證 PHP-CGI 不過分地佔用內存,為何不通過檢測內存的方式來處理呢?我非常認同高春輝所說的,通過設置進程的峰值內在佔用量來重啟 PHP-CGI 進程,會是更好的一個解決方案。3,php-fpm的慢日誌,debug及異常排查神器:request_slowlog_timeout設置一個超時的參數,slowlog設置慢日誌的存放位置,tail -f /var/log/即可看到執行過慢的php過程。大家可以看到經常出現的網路讀取超過、Mysql查詢過慢的問題,根據提示信息再排查問題就有很明確的方向了。require()語句用於指定的文件代替語句本身,就象C語言中的include()語句一樣。如果php配置文件php.ini中的URL fopenwrappers 是打開的(默認情況下是打開的),就可以使用URL來指定文件的位置從而實現遠程文件的調用。有一點就是使用require()和include()語句時要特別的注意。那就是在被包含的文件中,處理器是按照html模式來解釋其中的內容的,處理完被包含的內容後又恢復到php模式。所以如果需要在被包含文件中使用php語法,就要使用正確的php開始和結束標記來把這些語句包含進去。require()和include()知識php中的一種語言特性,而不是函數。它們和函數有許多不同的地方。include()語句和require()語句有許多相同的地方。凡是在上邊require()語句中沒有明確說明不能適用於include()的部分外,require()語句的功能完全適用於include()語句。下邊介紹require()語句所沒有的include()語句的功能和特點。include語句只有在被執行時才會讀入要包含的文件。在錯誤處理方便,使用include語句,如果發生包含錯誤,程序將跳過include語句,雖然會顯示錯誤信息但是程序還是會繼續執行!php處理器會在每次遇到include()語句時,對它進行重新處理,所以可以根據不同情況的,在條件控制語句和循環語句中使用include()來包含不同的文件。require_once()和include_once()語句分別對應於require()和include()語句。require_once()和include_once()語句主要用於需要包含多個文件時,可以有效地避免把同一段代碼包含進去而出現函數或變數重復定義的錯誤運行PHP程序,通常會遇到「Fatal Error: Allowed memory size of xxxxxx bytes exhausted」的錯誤, 這個意味著PHP腳本使用了過多的內存,並超出了系統對其設置的允許最大內存。解決這個問題,首先需要查看你的程序是否分配了過多的內存,在程序沒有問題的情況下,你可以通過一下方法來增加PHP的內存限制(memory_limit)。為了查看這個值,你需要建立一個空的php文件,比如view-php-info.php。然後將一下代碼貼到裡面。將這個腳本放到你的Web伺服器上,然後在瀏覽器中調用它。這時你可以看到你的PHP環境配置的信息,其中有一部分是關於「memory_limit」的,註:你可以用這種方法來查看php的其他參數設置,不僅僅是memory_limit這個完全依賴於你的應用的要求。比如Wordpress,運行起核心代碼需要32MB。Drupal 6則要求這個值最小為16MB,並推薦設置為32MB。如果你又安裝不少的插件(plugins),尤其是那些要進行圖像處理的模塊,那麼你可能需要128MB或更高的內存。說明: 這種方法只有在php以Apache模塊來執行時才生效。 在你的網站的根目錄下找到「.htaccess」文件,如果沒有,可以自己創建一個。然後把以下配置放入其中php_value memory_limit 128M ; 可以將128M改為任何你想設置的值在你的php代碼中增加以下命令行即可。1.首先找到對你的網站生效的php.ini文件 由於有多個地方都可以設置php的參數,找到正確的配置文件,並進行更改是首先要做的一步。如果你上面的方法建立了php文件來查看其配置參數,則你可以找到「Loaded Configuration File」這一項,以下是個例子:對於Linux用戶,你可以通過執行「php -i | grep Loaded Configuration File」來找到對應的配置文件。而Windows用戶,你可以嘗試修改你的php安裝目錄下的php.ini。2.編輯php.ini 在php.ini中,找到「memory_limit」這一項,如果沒有,你可以在文件的尾部自己增加這個參數。以下是一些設置範例3.重啟web 伺服器 如果是web伺服器使用Apache, 則執行:有些情況下,你可能不被允許私修改php.ini。比如如果你購買了虛擬主機服務,但是你的服務商確禁止你修改這個文件。那麼,你可以需要考慮用其他方法來增加memory_limit的值。如果你使用虛擬主機,有可能會出現memory_limit的值修改失敗。這個需要聯系你的服務商幫你處理。在實驗的時候發現是可以的,代碼如下在調用Test類實例的doExternalFunction()方法時,外部的func()方法是可以運行的,因為它是全局的。但是建議不要這樣使用,因為Test::doExternalFunction()對func()函數有依賴,當項目比較大時,而func()和Test類沒有同時引入到一個文件中來,會引起錯誤。比較理想的情況是,使用回調函數的形式來調用外部函數,就像執行在Test::doExternalFunction()執行sayHello()一樣require()語句用於指定的文件代替語句本身,就象C語言中的include()語句一樣。如果php配置文件php.ini中的URL fopenwrappers 是打開的(默認情況下是打開的),就可以使用URL來指定文件的位置從而實現遠程文件的調用。有一點就是使用require()和include()語句時要特別的注意。那就是在被包含的文件中,處理器是按照html模式來解釋其中的內容的,處理完被包含的內容後又恢復到php模式。所以如果需要在被包含文件中使用php語法,就要使用正確的php開始和結束標記來把這些語句包含進去。require()和include()知識php中的一種語言特性,而不是函數。它們和函數有許多不同的地方。include()語句和require()語句有許多相同的地方。凡是在上邊require()語句中沒有明確說明不能適用於include()的部分外,require()語句的功能完全適用於include()語句。下邊介紹require()語句所沒有的include()語句的功能和特點。include語句只有在被執行時才會讀入要包含的文件。在錯誤處理方便,使用include語句,如果發生包含錯誤,程序將跳過include語句,雖然會顯示錯誤信息但是程序還是會繼續執行!php處理器會在每次遇到include()語句時,對它進行重新處理,所以可以根據不同情況的,在條件控制語句和循環語句中使用include()來包含不同的文件。 require_once()和include_once()語句分別對應於require()和include()語句。require_once()和include_once()語句主要用於需要包含多個文件時,可以有效地避免把同一段代碼包含進去而出現函數或變數重復定義的錯誤將下載的擴展文件放在「PHP\ext」目錄下(在 PHP 4 中位於「PHP\extensions」目錄下)。打開php.ini 配置文件載入 PHP 擴展。extension=php_*.dll
㈣ 如何控制連接超時
用Fsocket獲取數據時能夠控制超時的。
如果用
File_get_contents($url);
可以臨時設定環境變數:
設定默認socket超時時間
ini_set("default_socket_timeout", 3);養成好習慣,使用fsocket獲取數據。
如果使用Curl,也可以在Curl中控制超時時間:
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
PHP中mysql函數是不提供類似mysql超時選項的,但是php.ini的mysql.connect_timeout可設置
; Maximum time (in seconds) for connect timeout. -1 means nolimit
mysql.connect_timeout = 60
也可以在php腳本中調用設置ini_set();
㈤ php進程超時介面返回504錯誤分析
在一次介面測試中,發現返回的http 504 time out 的錯誤,然後查看了php-fpm的錯誤日誌,發現了如下錯誤
從表現上看,是php進程超時導致的進程被kill了,那麼這個超時時間以及kill的機制是跟哪些參數有關呢,這里系統這里一下。
Nginx服務一般因為php的錯誤或者超時會有兩種錯誤碼502 bad Gateway 或者 504 Gateway Time-out
一種情況是php產生了語法錯誤,比如循環調用、變數作用域錯誤、方法不存在等,如果開啟錯誤日誌輸出的話,這種錯誤在php-fpm的錯誤日誌中是可以看到調用棧信息的。
另外一種情況可能就是超時引起的php-fpm主動kill的情況,在php.ini和php.fpm中有兩個配置項,用來管理php腳本的最大執行時間
當php腳本的執行時間超過這個時間時,PHP-FPM不只會終止腳本的執行,還會終止執行腳本的Worker進程。所以Nginx會發現與自己通信的連接斷掉了,就會返回給客戶端502錯誤。
以頂部的錯誤為例,當報502錯誤是,nginx的errorlog中有如下日誌,:
所以只需將這兩項的值調大一些就可以讓PHP腳本不會因為執行時間長而被終止了。request_terminate_timeout可以覆蓋max_execution_time,
所以如果不想改全局的php.ini,那隻改PHP-FPM的配置就可以了。
此外要注意的是Nginx的upstream模塊中的max_fail和fail_timeout兩項。這兩個配置表示在fail_timeout事件內,如果fail的測試達到max_fail,那麼在接下來的fail_timeout時間內,Nginx都會認為上游伺服器掛掉了,都會返回502錯誤。
所以可以將max_fail調大一些,將fail_timeout調小一些。
PHP-FPM設置的腳本最大執行時間已經夠長了,但執行耗時PHP腳本時,發現Nginx報錯從502變為504了。這是為什麼呢?
因為我們修改的只是PHP的配置,Nginx中也有關於與上游伺服器通信超時時間的配置
以Nginx超時時間為90秒,PHP-FPM超時時間為300秒為例,報504 Gateway Timeout錯誤時的Nginx錯誤訪問日誌如下:
調高這三項的值(主要是read和send兩項,默認不配置的話Nginx會將超時時間設為60秒)之後,504錯誤也解決了。
而且這三項配置可以配置在http、server級別,也可以配置在location級別。擔心影響其他應用的話,就配置在自己應用的location中吧。
要注意的是factcgi_connect/read/send_timeout是對FastCGI生效的,而proxy_connect/read/send_timeout是對proxy_pass生效的。
參考鏈接: http://www.cnblogs.com/fei33423/p/8184098.html 感謝分享!
㈥ PHP 如何讓時間自動更新
方法有兩種:
方法一
(1.WINDOW 定時調用PHP腳本:
do
set ws=createobject("wscript.shell")
ws.run"D:\php\php.exe D:\php\source\do.php",vbhide
wscript.sleep 5000 '毫秒
loop新建文本文件,復制以上腳本,另存為後綴為*(.vbs)的文件後即可;
(2.下載PHP,解壓到D:
php.ini-dist重命名為php.ini,
修改PHP.ini裡面的 extension_dir = 「D:\php\ext\」
新建
\source\do.php
就可以定時執行do.php了。
方法二
使用死循環
如:
http://www.lianglong.cq.cn/post/320.html
set_time_limit(0);
ignore_user_abort(true);
㈦ php如何設置程序執行時間
php中預設的最長執行時間是 30 秒,這是由 php.ini 中的 max_execution_time 變數指定,倘若你有一個需要頗多時間才能完成的工作,例如要發送很多電子郵件給大量收件者,或者要進行繁重的數據分析工作,伺服器會在 30 秒後強行中止正在執行的程序。
設置的辦法是:
一、直接修改php.ini 中 max_execution_time 的數值。
二、在沒許可權修改php.ini文件時,在 PHP 程序中加入 ini_set('max_execution_time', '0'),數值 0 表示沒有執行時間的限制。