用stream_系列函数实现远程文件本地化,怎么防止卡死
用stream_系列函数实现远程文件本地化,如何防止卡死
还是我前两天写的代码,已经用于采集内容了,今天用来改进采集到的内容中的图片等远程文件的本地化,有时候还是会卡死,高手看看如何能防止卡死。
代码如下,这个代码还是提供两种方式实现本地化进行比较,时事证明这种流方式实现效率是提高了。
- PHP code
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php $dir = str_replace('\\', '/', dirname(__FILE__)) . '/';$timeStart = microtime(true);$data = '';$urls = array('http://www.jxcms.com/upload/2011/0518/0337319304.jpg', 'http://www.jxcms.com/upload/2011/0310/0951568835.jpg', 'http://www.tzksgs.com/upload/banner1.jpg', 'http://www.tzksgs.com/upload/banner2.jpg');foreach($urls as $url) { copy($url, $dir . 'a_' . basename($url));}$timeEnd = microtime(true);echo sprintf("Spend time: %s second(s)\n", $timeEnd - $timeStart), '<br>';$timeStart = microtime(true);function getMoreContent($urls) { $timeout = 30; $rs = array(); $sockets = array(); $userAgent = $_SERVER['HTTP_USER_AGENT']; foreach($urls as $id => $url) { $tmp = parse_url($url); $host = $tmp['host']; $path = isset($tmp['path'])?$tmp['path']:'/'; empty($tmp['query']) or $path .= '?' . $tmp['query']; if (empty($tmp['port'])) { $port = $tmp['scheme'] == 'https'?443:80; } else $port = $tmp['port']; $fp = stream_socket_client("$host:$port", $errno, $errstr, $timeout); if ($fp) { $rs[$id] = ''; $sockets[$id] = $fp; fwrite($fp, "GET $path HTTP/1.1\r\nHost: $host\r\nUser-Agent: $userAgent\r\nConnection: Close\r\n\r\n"); } } // Now, wait for the results to come back in while (count($sockets)) { $read = $sockets; // This is the magic function - explained below if (stream_select($read, $write = null, $e = null, $timeout)) { // readable sockets either have data for us, or are failed connection attempts foreach ($read as $r) { $id = array_search($r, $sockets); $data = fread($r, 8192); if (strlen($data) == 0) { fclose($r); $tmp = explode("\r\n\r\n", $rs[$id], 2); $rs[$id] = strpos($tmp[0], '200')?$tmp[1]:''; unset($sockets[$id]); } else $rs[$id] .= $data; } } } return $rs;}$rs = getMoreContent($urls);foreach($rs as $k => $v) { @file_put_contents($dir . 'b_' . basename($urls[$k]), $v);}$timeEnd = microtime(true);echo sprintf("Spend time: %s second(s)\n", $timeEnd - $timeStart);?>
------解决方案--------------------
由于php没有计时器,所以你不可能中断一个没有中断接口的函数的执行
所以底层函数都只适合于理想的条件下
我依然建议你使用多道的curl来完成你的工作
- PHP code
$urls = array( 'http://www.jxcms.com/upload/2011/0518/0337319304.jpg', 'http://www.jxcms.com/upload/2011/0310/0951568835.jpg', 'http://www.tzksgs.com/upload/banner1.jpg', 'http://www.tzksgs.com/upload/banner2.jpg');$mh = curl_multi_init();foreach ($urls as $i => $url) { $conn[$i] = curl_init($url); curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER,1); curl_multi_add_handle($mh, $conn[$i]);}do { curl_multi_exec($mh, $active); //在这个循环中,你有机会中断程序的执行。curl_getinfo提供了连接的各种信息}while($active);foreach ($urls as $i => $url) { $fn = basename($url); file_put_contents($fn, curl_multi_getcontent($conn[$i])); curl_close($conn[$i]);}<div class="clear"> </div>

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

.tmp檔案大部分都是因為不正常關機、或死機後所留下的文件,這些臨時的暫存盤,在你重新開機後,已經沒有任何的用途,可以放心刪除。大家在使用Windows作業系統的時候,可能會常在C盤根目錄發現一些後綴名為TMP的文件,也會在Windows目錄裡發現一個TEMP的目錄,TMP檔案是各種軟體或系統產生的暫存文件,也就是常說的垃圾檔案。 Windows產生的臨時文件,本質上和虛擬記憶體沒什麼兩樣,只不過臨時文件比虛擬記憶體更具針對性,單獨為某個程式服務而已。而它的專一性導致了許多新手對他望而生畏,不刪佔

http狀態碼520是指伺服器在處理請求時遇到了一個未知的錯誤,無法提供更具體的資訊。用於表示伺服器在處理請求時發生了一個未知的錯誤,可能是由於伺服器配置問題、網路問題或其他未知原因導致的。通常是由伺服器配置問題、網路問題、伺服器過載或程式碼錯誤等原因導致的。如果遇到狀態碼520錯誤,最好聯絡網站管理員或技術支援團隊以取得更多的資訊和協助。

http狀態碼403是伺服器拒絕了客戶端的請求的意思。解決http狀態碼403的方法是:1、檢查身份驗證憑證,如果伺服器要求身份驗證,確保提供正確的憑證;2、檢查IP位址限制,如果伺服器對IP位址進行了限制,確保客戶端的IP位址被列入白名單或未列入黑名單;3、檢查文件權限設置,如果403狀態碼與文件或目錄的權限設置有關,確保客戶端具有足夠的權限訪問這些文件或目錄等等。

centos7系統中tmp目錄下有很多垃圾,想要清除垃圾,該怎麼清除呢?下面我們就來看看詳細的教學。查看tmp檔案目錄下檔案列表,執行指令cdtmp/切換到tmp目前檔案目錄,執行ll指令,查看目前目錄下檔列表。如下圖所示。使用rm刪除檔案指令,需要注意的是rm指令是將檔案永遠從系統中刪除,因此建議在使用rm指令時,最好是在刪除檔案前給予提示。使用指令rm-i檔名,等用戶確認刪除(y)或跳過刪除(n),系統進行對應的操作。如下圖所示。

掌握HTTP301狀態碼的意思:網頁重定向的常見應用場景隨著網路的快速發展,人們對網頁互動的要求也越來越高。在網頁設計領域,網頁重定向是一種常見且重要的技術,透過HTTP301狀態碼來實現。本文將探討HTTP301狀態碼的意義以及在網頁重新導向中的常見應用場景。 HTTP301狀態碼是指永久重新導向(PermanentRedirect)。當伺服器接收到客戶端發

HTTP狀態碼200:探索成功回應的意義與用途HTTP狀態碼是用來表示伺服器回應狀態的數字代碼。其中,狀態碼200表示請求已成功被伺服器處理。本文將探討HTTP狀態碼200的具體意義與用途。首先,讓我們來了解HTTP狀態碼的分類。狀態碼分為五個類別,分別是1xx、2xx、3xx、4xx和5xx。其中,2xx表示成功的回應。而200是2xx中最常見的狀態碼

如何使用NginxProxyManager實現HTTP到HTTPS的自動跳轉隨著互聯網的發展,越來越多的網站開始採用HTTPS協議來加密傳輸數據,以提高數據的安全性和用戶的隱私保護。由於HTTPS協定需要SSL憑證的支持,因此在部署HTTPS協定時需要有一定的技術支援。 Nginx是一款強大且常用的HTTP伺服器和反向代理伺服器,而NginxProxy

使用http.PostForm函數發送帶有表單資料的POST請求在Go語言的http包中,可以使用http.PostForm函數發送帶有表單資料的POST請求。 http.PostForm函數的原型如下:funcPostForm(urlstring,dataurl.Values)(resp*http.Response,errerror)其中,u
