2017-09-29 194 views
0

會發生什麼是我有一個PHP腳本,它向網站提出了很多請求,我的腳本在我的服務器上。然而,問題如下:請求超時與php + cURL

ERROR - REQUEST TIMED OUT

<?php 

$ch = curl_init(); 
$contador = 0; 
$ran = explode("\n", file_get_contents('nombres.txt')); 
$randomElement = $ran[array_rand($ran, 1)]; 

if ($file = fopen("correos.txt", "r")) { 
    while(!feof($file)) { 
     $line = fgets($file); 


$var_post_data = 'site_id=1&email='.$line.'&name='.$randomElement.'id=39494393'; 
curl_setopt($ch, CURLOPT_URL,"site"); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS,$var_post_data); //Post Fields 
//curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

$headers = [ 
    'Cookie: ws_visit_id=2_170927230320231_5878; has_track_visit=true; _uetsid=_uet0639d46c', 
    'DNT: 1', 
    'Connection: keep-alive', 
    'Accept: application/json, text/javascript, */*; q=0.01', 
    'Accept-Language: en-US,en;q=0.5', 
    'Cache-Control: no-cache', 
    'Content-Type: application/x-www-form-urlencoded; charset=UTF-8', 
    'Host: site', 
    'Referer: site', 
    'User-Agent: ' . $randomElement, 
    'X-Requested-With: XMLHttpRequest' 
]; 

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
echo curl_errno($ch); 
echo curl_error($ch); 
$server_output = curl_exec ($ch); 

    echo $server_output ; 
    echo $contador; 
    $fp = fopen('data.txt', 'a'); 
    fwrite($fp, $server_output); 
    $stringData = "-------------" . "\n"; 
    fwrite($fp, $stringData); 

    // sleep for 240 sec 
    #sleep(240); // sleep for 240 sec 
    #sleep(240); // sleep for 240 sec 
    #sleep(240); // sleep for 240 sec 
if(curl_errno($ch) == 26) { 
    sleep(30); 
} 
else { 
    echo 'Not errors'; 
    continue; 
} 


    } 
    fclose($file); 
} 
curl_close ($ch); 



?> 

我還澄清說,我已經配置我的服務器上「的max_execution_time」功能,並將其設置爲「0」。如果你能幫助我,我希望腳本能夠做到這一點,如果遠程服務器發出錯誤,讓我的腳本執行sleep(),我將不勝感激。我已經嘗試了所有方法,但這對我不起作用。

謝謝!

+0

'$ line = fgets($ file);'每次迭代都會覆蓋此var,實際上只包含最後一行?否則,我不會發現任何與您的腳本不同的地方,從客戶的角度來看會導致超時錯誤,您是否控制了您發佈的服務器? – Scuzzy

+0

我如何解決這個覆蓋問題?所以我試着回到這裏...而不是,我沒有控制遠程服務器 – Zenabria

+0

@Scuzzy謝謝你.. – Zenabria

回答

0

你有幾個問題,1:$ran = explode("\n", file_get_contents('nombres.txt'));這裏你使用linux風格的換行符作爲分隔符,除非你在這裏打開OS-native文本模式,這意味着換行符會被讀取\ n在一些操作系統(如Windows)上,\ n在某些(如Linux)上,\ r在一些操作系統上(如舊款Mac),因此該行僅適用於某些操作系統。使其與平臺無關,以二進制模式「rb」打開它。下一個:$var_post_data = 'site_id=1&email='.$line.'&name='.$randomElement.'id=39494393';這裏$ line和$ randomElement不是urlencoded,所以如果它們包含&或者=或者許多其他字符,編碼將會格式錯誤,並且服務器可能會以400 Bad Request響應或以其他方式讀取損壞的數據。使用urlencode()來正確地urlencode它。下一步:這段代碼看起來很可疑:Cookie: ws_visit_id=2_170927230320231_5878,你確定要硬編碼cookie的ID,而不是隻是得到一個新的?該Cookie ID很可能已過期很久以前..下一個:Content-Type: application/x-www-form-urlencoded; charset=UTF-8此標頭無效,x-www-urlencoded不支持UTF8,它始終採用ASCII編碼,對非ascii字符使用特殊編碼,但不要將此標頭添加到所有,libcurl都會爲你添加它,而不像你,libcurl在這樣做時不會犯任何錯誤。 但這些問題都不能解釋您屏幕截圖中的錯誤消息。看起來你的http服務器中有一個負載平衡方案,出於某種原因,它是一個web服務器配置問題,而不是php問題。該錯誤可能是由Apache或Nginx或IIS或任何前面的php生成的。