在 While 循环中执行 PHP CURL

3

我有一个表格,想在维护期间运行PHP脚本。

以下是我的代码:

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

从数据库获取表后,我的url数组如下。

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);

问题在于只有一个URL使用CURL被执行,并且在我的表中,只有一行被更新为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);

更新表格列是正确的方式吗?

你使用PDO吗?$row的转储会产生什么结果? - Andrei
使用ADODB。我已经为url提供了数组$row的产出。 - yuri1000
你需要在 while 循环内初始化 curl 并关闭它,或者使用 multi_curl_exec - hassan
@hassan 我也尝试了multi_curl_*,就像http://stackoverflow.com/a/2874951/4306705中所述,但是只有一个URL运行了而不是所有的URL。我感觉所有的URL都是相同的,除了消息参数,可能这是原因? - yuri1000
1个回答

2

我曾经遇到过同样的问题,并在网上找到了解决方案。只需要将curl代码从循环中分离出来,然后再尝试。

类似于这样:

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;
}

希望这也能对您有所帮助。

嗨,谢谢你的帮助。它在模糊地运行,有时运行1个URL,有时运行3个,有时运行2个。我不明白。 - yuri1000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接