本文目錄一覽:
- 1、對於PHP中file_get_contents 中文亂碼有什麼解決方案嗎?
- 2、PHP中有兩個讀文件函數,file()和file_get_contents(),這兩個函數有何差異?
- 3、PHP file_get_contents 函數超時的幾種解決方法
- 4、為什麼在服務器上php里執行file
對於PHP中file_get_contents 中文亂碼有什麼解決方案嗎?
解決代碼邏輯如下
$content = ”;
$text = file_get_contents($file);
//$encodType = mb_detect_encoding($text);
define(‘UTF32_BIG_ENDIAN_BOM’, chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));
define(‘UTF32_LITTLE_ENDIAN_BOM’, chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));
define(‘UTF16_BIG_ENDIAN_BOM’, chr(0xFE) . chr(0xFF));
define(‘UTF16_LITTLE_ENDIAN_BOM’, chr(0xFF) . chr(0xFE));
define(‘UTF8_BOM’, chr(0xEF) . chr(0xBB) . chr(0xBF));
$first2 = substr($text, 0, 2);
$first3 = substr($text, 0, 3);
$first4 = substr($text, 0, 3);
$encodType = “”;
if (UTF8_BOM == $first3) {
$encodType = ‘UTF-8 BOM’;
} else if (UTF32_BIG_ENDIAN_BOM == $first4) {
$encodType = ‘UTF-32BE’;
} else if (UTF32_LITTLE_ENDIAN_BOM == $first4) {
$encodType = ‘UTF-32LE’;
} else if (UTF16_BIG_ENDIAN_BOM == $first2) {
$encodType = ‘UTF-16BE’;
} else if (UTF16_LITTLE_ENDIAN_BOM == $first2) {
$encodType = ‘UTF-16LE’;
}
//下面的判斷主要還是判斷ANSI編碼的·
if (” == $encodType) {
//即默認創建的txt文本-ANSI編碼的
$content = iconv(“GBK”, “UTF-8”, $text);
} else if (‘UTF-8 BOM’ == $encodType) {
//本來就是UTF-8不用轉換
$content = $text;
} else {
//其他的格式都轉化為UTF-8就可以了
$content = iconv($encodType, “UTF-8”, $text);
} (BY三人行慕課)
PHP中有兩個讀文件函數,file()和file_get_contents(),這兩個函數有何差異?
PHP中file() 函數和file_get_contents() 函數的作用都是將整個文件讀入某個介質,其主要區別就在於這個介質的不同。file() 函數是將文件讀入一個數組中,而file_get_contents()是將文件讀入一個字符串中。
file() 函數是把整個文件讀入一個數組中,然後將文件作為一個數組返回。數組中的每個單元都是文件中相應的一行,包括換行符在內。如果失敗,則返回 false。
file_get_contents() 函數是把整個文件讀入一個字符串中。和 file() 一樣,不同的是file_get_contents() 把文件讀入一個字符串。file_get_contents() 函數是用於將文件的內容讀入到一個字符串中的首選方法。如果操作系統支持,還會使用內存映射技術來增強性能。
PHP file_get_contents 函數超時的幾種解決方法
這裡就簡單介紹兩種:
一、增加超時的時間限制
這裡需要注意:set_time_limit只是設置你的PHP程序的超時時間,而不是file_get_contents函數讀取URL的超時時間。
我一開始以為set_time_limit也能影響到file_get_contents,後來經測試,是無效的。真正的修改file_get_contents延時可以用resource
$context的timeout參數:
複製代碼
代碼如下:
$opts
=
array(
‘http’=array(
‘method’=”GET”,
‘timeout’=60,
)
);
$context
=
stream_context_create($opts);
$html
=file_get_contents(”,
false,
$context);
fpassthru($fp);
二、一次有延時的話那就多試幾次
有時候失敗是因為網絡等因素造成,沒有解決辦法,但是可以修改程序,失敗時重試幾次,仍然失敗就放棄,因為file_get_contents()如果失敗將返回
FALSE,所以可以下面這樣編寫代碼:
複製代碼
代碼如下:
$cnt=0;
while($cnt
3
($str=@file_get_contents(‘http…’))===FALSE)
$cnt++;
為什麼在服務器上php里執行file
1. 我們從未手動開啟過PHP的相關進程,它是隨着Apache的啟動而運行的;
2. PHP通過mod_php5.so模塊和Apache相連(具體說來是SAPI,即服務器應用程序編程接口);
3. PHP總共有三個模塊:內核、Zend引擎、以及擴展層;
4. PHP內核用來處理請求、文件流、錯誤處理等相關操作;
5. Zend引擎(ZE)用以將源文件轉換成機器語言,然後在虛擬機上運行它;
6. 擴展層是一組函數、類庫和流,PHP使用它們來執行一些特定的操作。比如,我們需要mysql擴展來連接MySQL數據庫;
7. 當ZE執行程序時可能會需要連接若干擴展,這時ZE將控制權交給擴展,等處理完特定任務後再返還;
8. 最後,ZE將程序運行結果返回給PHP內核,它再將結果傳送給SAPI層,最終輸出到瀏覽器上。
原創文章,作者:LLC8X,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/130175.html