1. 程式人生 > >osx平臺呼叫curl_multi_exec失敗指令碼死迴圈

osx平臺呼叫curl_multi_exec失敗指令碼死迴圈

發現在windows和linux平臺上執行良好的curl_multi_exec指令碼在OSX卻總是一直執行並且沒有返回結果,找遍百度沒有答案。

很鬱悶這個問題糾纏了我一下午,我本地php版本:

[email protected]:~$ php -v
PHP 5.4.24 (cli) (built: Jan 19 2014 21:32:15)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans

[email protected]:~$

使用指令碼:

<?php

// 建立一對cURL資源
$ch1 = curl_init();
$ch2 = curl_init();

// 設定URL和相應的選項
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

// 建立批處理cURL控制代碼
$mh = curl_multi_init();

// 增加2個控制代碼
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$active = null;
$i=0;
// 執行批處理控制代碼
do {
    $mrc = curl_multi_exec($mh, $active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {

    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

// 關閉全部控制代碼
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

?>


此指令碼只會一直執行而沒有任何返回,相當於無效。

關於此問題的解決方法我參考了這裡:

http://stackoverflow.com/questions/19999403/curl-multi-exec-fails-on-mac-os-x

還有這篇文章的一些參考:

https://bugs.php.net/bug.php?id=63411

http://marchtea.com/?p=109

他們的解釋:

On php 5.3.18+ be aware that curl_multi_select() may return -1 forever until you call curl_multi_exec().

Try this:

while ($this->active && $mrc == CURLM_OK) 
{   
   // add this line
   while (curl_multi_exec($this->mh, $this->active) === CURLM_CALL_MULTI_PERFORM);

   if (curl_multi_select($this->mh) != -1) 
   {   
       do {
           $mrc = curl_multi_exec($this->mh, $this->active);
           if ($mrc == CURLM_OK)
           {   
               while($info = curl_multi_info_read($this->mh))
               {   
                   $this->process($info);
               }        
           }   
       } while ($mrc == CURLM_CALL_MULTI_PERFORM);
   }   
} 

重寫之後的方法是:

<?php


$ch1 = curl_init();
$ch2 = curl_init();

// 設定URL和相應的選項
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net");
curl_setopt($ch2, CURLOPT_HEADER, 0);

// 建立批處理cURL控制代碼
$mh = curl_multi_init();

// 增加2個控制代碼
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$active = null;

do {
	$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) 
{   
   // add this line
   while (curl_multi_exec($mh, $active) === CURLM_CALL_MULTI_PERFORM);

   if (curl_multi_select($mh) != -1) 
   {   
       do {
           $mrc = curl_multi_exec($mh, $active);
           if ($mrc == CURLM_OK)
           {   
               while($info = curl_multi_info_read($mh))
               {   
                   var_dump($info);
               }        
           }   
       } while ($mrc == CURLM_CALL_MULTI_PERFORM);
   }   
}

 //close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);


?>
這樣就可以正常呼叫了。

解決方法是有了,但是希望有人能給出第一個指令碼無法在OSX正常執行的原因。


另外來自於:http://blog.marchtea.com/archives/109#comment-13220

的看法是這樣的:

關鍵在於在while迴圈中要執行curl_multi_exec,直到處理完畢再進入select.

相關推薦

osx平臺呼叫curl_multi_exec失敗指令碼迴圈

發現在windows和linux平臺上執行良好的curl_multi_exec指令碼在OSX卻總是一直執行並且沒有返回結果,找遍百度沒有答案。 很鬱悶這個問題糾纏了我一下午,我本地php版本: [email protected]:~$ php -v PHP 5

Java指令碼API執行指令碼程式防止指令碼迴圈

Java指令碼API執行指令碼程式防止死迴圈 前提概要 當我們使用java指令碼API執行指令碼的時候,在一些我們並不知道指令碼的程式邏輯並且無法修改指令碼的特殊的場景下,如果指令碼中存在死迴圈(endless loop)或者高資源消耗的耗時迴圈語句,程

ubantu系統修改許可權失敗,導致只能客人會話登入解決辦法 ubantu系統出現登入介面迴圈處理辦法 ubantu系統出現登入介面迴圈處理辦法

由於之前想將使用者授予root許可權,參考了網上的修改“使用者名稱:x:0:500:tommy:/home/tommy:/bin/bash”,將兩個1000改為0的辦法,可能是因為沒有登出,導致切換使用者後,只能進入到客人會話模式。並且悲催地忘了root密碼,於是下面介紹一下自己的拯救辦法: 第一步:關閉“

ubantu系統出現登入介面迴圈處理辦法 ubantu系統修改許可權失敗,導致只能客人會話登入解決辦法

繼上篇ubantu系統修改許可權失敗,導致只能客人會話登入解決辦法部落格,雖然進行了相應的修改,但是卻出現了登入死迴圈情況,於是再次進行修改。 第一步:“ctrl+Alt+F1”進入命令列介面,輸入使用者名稱+密碼,登陸進去。 第二步:這次應該是按照以前的辦法輸入“startx”命令,但是出現了“ti

shell中迴圈呼叫hive sql 指令碼

指令碼tt.sh的內容如下: #!/bin/bash params=$1 for param in $params   do     echo $param  done 執行方式為:sh tt.sh "1 2 3 4 5" 輸出為: 1 2 3 4 5 ---------

如何解決svn清理失敗 不能更新 cleanup失敗 cleanup亂碼 更新亂碼 svn更新提示清理 清理亂碼不能清理 svn故障修復SVN cleanup 陷入迴圈 svn cleanup時遇到錯誤怎麼辦

平時使用svn的過程中,有的時候由於自己操作故障或者系統原因,導致svn不能更新,提示cleanup也不能成功,陷入了死迴圈 原因是;svn的資料庫佇列原因 1,下載sqlite3.exe,google一下就有了 2.將下載好的檔案放到svn的根目錄也就是有svn隱藏資料夾的地方 跟這個資料夾同一

中斷裡呼叫HAL_Delay()進入迴圈的原因

CUBE生成的程式中, SysTick是中斷型延時(利用中斷來查詢時間到了沒)。   /* Use systick as time base source and configure 1ms tick (default clock after Reset is MSI) *

while迴圈

1、沒有自增自減變數 public static void main(String[] args){ int x = 0; while( x < 3 ) { System.out.println("value of x : " + x );

使用@ManyToMany查詢資料時的迴圈問題解決辦法

初學使用spring data jpa,將問題記錄 以User 和Role為例,兩者為雙向的多對多關係,即可以通過User查詢到Role資訊,也可以通過Role查詢到User資訊 首先要明白為什麼會出現死迴圈這個問題,造成這個死迴圈的原因是因為查詢User時,包含了Role屬性,Role中又

多執行緒下HashMap的迴圈

多執行緒下HashMap的死迴圈 Java的HashMap是非執行緒安全的。多執行緒下應該用ConcurrentHashMap。 多執行緒下[HashMap]的問題(這裡主要說死迴圈問題): 1、多執行緒put操作後,get操作導致死迴圈。 2、多執行緒

HashMap的迴圈解析

HashMap死迴圈問題圖解      在HashMap的陣列真實長度達到閾值後,會呼叫擴容方法: void resize(int newCapacity) { Entry[] oldTable = table

1024這天,我故意寫了個迴圈~

摘要: 導致CPU100%的原因很多,而程式中出現死迴圈就是原因之一。然而,並不是每個人在工作中都有機會踩中這個坑。我就是其中一個沒踩過的。人生似乎有些不完整。 所以,我做了一個很重要的決定:在程式中寫一個死迴圈。 作為一個開發者,有一個學習的氛圍跟一個交流圈子特別重要這是一個我的Q

springboot中@NamedQuery查詢結果出現迴圈

在進行@NamedQuery時,出現這樣的結果: [{"id":1,"name":"諸葛亮","address":"成都","age":33,"sex":"男","clazz":{"code":1,"name":"應用數學1班","students":[{"id":2,"name":"觀音","

Java HashMap的迴圈

在淘寶內網裡看到同事發了貼說了一個CPU被100%的線上故障,並且這個事發生了很多次,原因是在Java語言在併發情況下使用HashMap造成Race Condition,從而導致死迴圈。這個事情我4、5年前也經歷過,本來覺得沒什麼好寫的,因為Java的HashMap是非執行緒安全的,所以在併

排查定位由迴圈引起的cpu負載飆高或者

在linux下: linux的top命令可以檢視程序的pid,我們找到java程式的pid, 然後執行 top -Hp pid 就可以檢視到這個程序下執行緒的執行情況。 這樣粗略可以看到哪些執行緒比較繁忙,這時候就用到jdk自帶的小工具jstack(官方文件或者自行 百度)。 我們

request.getRequestDispatcher(url)使用後天一直報錯,進入迴圈

request.getRequestDispatcher(url)使用後天一直報錯,進入死迴圈 後來百度了下: request.getRequestDispatcher(“/資源URI”).forward(request,response) response.sendRedir

hibernate關聯物件通過Springmvc轉json迴圈

在使用JPA+Springboot開發過程中,由於用到ajax非同步,在拿到資料後轉json過程中,出現棧溢位的迴圈,分析得出是物件關聯關係的問題。 在各種百度之後,得出的結論有很多 方法一:使用jsonIgnore註解 @JsonIgnoreProperti

json-lib把javabean物件轉換成json字串出現迴圈問題

javabean中的關聯物件互相呼叫,出現死迴圈 解決方案一: 加一個JsonCongfig設定,設定出現死迴圈的屬性 JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setExcludes(new String[]{"depar

SVN 提示clean up 進入迴圈

SVN在使用update命令時,提示使用“clean up ”命令,在使用clean up命令時報錯“Previous operation has not finished; run 'cleanup' if it was interrupted”。同時無論在那個目錄路徑下執行“clean up&n

多執行緒環境迴圈定位

你的軟體在某個時刻停止服務,CPU佔用達到100%+,這種問題一個可能的原因是產生了死迴圈,假設程式某處存在潛在的死迴圈,並在某種條件下會引發,本文以一個示例來定位出現死迴圈的位置。 當程式某處存在死迴圈,通常定位問題及縮小範圍的方法是,在可疑的程式碼處加log,或者註釋掉可疑程式碼,這對