2017-04-03 67 views
1

我有一張表,我希望在維護期間運行PHP腳本。在While循環中執行PHP CURL

我有以下代碼。

$sql = "SELECT `id`, `url` FROM `log_requests` WHERE `is_sent` = '0'"; 
$e = $conn->execute($sql); 

我的url數組在從DB中獲取表之後。

Array 
(
[0] => https://www.smsgatewaycenter.com/library/send_sms_2.php?UserName=username&Password=password&Type=Individual&To=9999999999&Mask=Senderid&Message=Hello+World+1 
[1] => https://www.smsgatewaycenter.com/library/send_sms_2.php?UserName=username&Password=password&Type=Individual&To=9999999999&Mask=Senderid&Message=Hello+World+2 
[2] => https://www.smsgatewaycenter.com/library/send_sms_2.php?UserName=username&Password=password&Type=Individual&To=9999999999&Mask=Senderid&Message=Hello+World+3 
[3] => https://www.smsgatewaycenter.com/library/send_sms_2.php?UserName=username&Password=password&Type=Individual&To=9999999999&Mask=Senderid&Message=Hello+World+4 
) 

然後我跑while循環

$ch = curl_init(); 
while($row = $e->FetchRow()){ 
    curl_setopt($ch, CURLOPT_URL, $row['url']); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    $q = "UPDATE `log_requests` SET `is_sent` = '1' WHERE `id` = '".$row['id']."'"; 
    $conn->execute($q); 
} 
curl_close($ch); 

問題是唯一一個使用curl執行URL,然後在我的表中只有一行獲取is_sent列更新爲1。

爲什麼在我while循環運行單個URL。我在這裏犯了什麼錯誤?

*************************編輯********************

好吧,現在我想出了下面,現在運行成功。我只想知道我是否正確。

$set = array(); 
while ($row = $executequery2->FetchRow()) { 
    $set[$row['url']][] = $row; 
} 

$curl_handles = array(); 
foreach($set as $url => $rows) { 
    $curl_handles[$url] = curl_init(); 
    curl_setopt($curl_handles[$url], CURLOPT_URL, $url); 
    foreach($rows as $row) { 
     $query3 = "UPDATE `log_requests` SET `is_sent` = '1' WHERE `id` = '" . $row['id'] . "'"; 
     $conn->Execute($query3); 
    } 
} 

$curl_multi_handle = curl_multi_init(); 
$i = 0; 
$block = array(); 

foreach($curl_handles as $a_curl_handle) { 
    $i++; 
    curl_multi_add_handle($curl_multi_handle, $a_curl_handle); 
    $block[] = $a_curl_handle; 
    if (($i % 5 == 0) or ($i == count($curl_handles))) { 
     $running = NULL; 
     do { 
      $running_before = $running; 
      curl_multi_exec($curl_multi_handle, $running); 
      if ($running != $running_before) { 
       echo ("Waiting for $running sites to finish...<br />"); 
      } 
     } 
     while ($running > 0); 
     foreach($block as $handle) { 
      $code = curl_getinfo($handle, CURLINFO_HTTP_CODE); 
      $curl_errno = curl_errno($handle); 
      $curl_error = curl_error($handle); 
      if ($curl_error) { 
       echo (" *** cURL error: ($curl_errno) $curl_error\n"); 
      } 
      curl_multi_remove_handle($curl_multi_handle, $handle); 
     } 
     $block = array(); 
    } 
} 

curl_multi_close($curl_multi_handle); 

更新表列是正確的方法嗎?

+0

您使用的是PDO嗎? '$ row'的轉儲會產生什麼結果? – Andrew

+0

使用ADODB。我給了'url' $ row yield數組 – yuri1000

+0

您需要初始化curl並在while循環中關閉它,或者使用[multi_curl_exec](http://php.net/manual/en/function.curl -multi-exec.php)而不是 – hassan

回答

0

我遇到過同樣的問題,並在線獲得了此解決方案。只需將循環代碼與循環分開,然後嘗試。

事情是這樣的:

while($row = $e->FetchRow()) { 
    $result = call_curl($row['url']); 
    if($result === FALSE) { 
     die("Error"); 
    } 
    else 
    { 
     $q = "UPDATE `log_requests` SET `is_sent` = '1' WHERE `id` = '".$row['id']."'"; 
    } 
} 


function call_curl($url) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    $result = curl_exec ($ch); 
    curl_close($ch); 
    return $result; 
} 

希望這有助於你。

+0

嗨,感謝您的幫助。它隱約奔跑,有時它跑1個網址,有時3個,有時2個。我不明白 – yuri1000