PHP curl вопросы - выполняется несколько раз - PullRequest
1 голос
/ 06 октября 2010

У меня есть этот код:

<?php

 foreach($items as $item) {

   $site = $item['link'];
   $id = $item['id'];
   $newdata = $item['data_a'];
   $newdata2 = $item['data_b'];

   $ch = curl_init($site.'updateme.php?id='.$id.'&data1='.$newdata.'&data2='.$newdata2);
   curl_exec ($ch);
   // do some checking here
   curl_close ($ch);

 }

?>

Пример ввода:

$site = 'http://www.mysite.com/folder1/folder2/';

$id = 512522;

$newdata = 'Short string here';

$newdata = 'Another short string here with numbers';

Здесь основной процесс updateme.php

if (!$id = intval(Tools::getValue('id')))
    $this->_errors[] = Tools::displayError('Invalid ID!');
else
{
    $history = new History();
    $history->id = $id;
    $history->changeState($newdata1, intval($id));
    $history->id_employee = intval($employee->id_employee);
    $carrier = new Carrier(intval($info->id_carrier), intval($info->id_lang));
    $templateVars = array('{delivery}' => ($history->id_data_state == _READY_TO_SEND AND $info->shipping_number) ? str_replace('@', $info->shipping_number, $carrier->url) : '');
    if (!$history->addWithemail(true, $templateVars))
        $this->_errors[] = Tools::displayError('an error occurred while changing status or was unable to send e-mail to the employee');
}

Сайт всегда будет меняться, и в каждом $ items будет по крайней мере 20 данных, поэтому цикл foreach будет выполняться по крайней мере 20 или более раз в зависимости от количества данных.

Целевой сайт обновит свою базу данных с помощью переданных переменных, вероятно, он передаст по крайней мере 5 функций, прежде чем будет сохранен в БД, так что это может занять некоторое время.

Мой вопрос: будет ли проблема с этим подходом? Будет ли скрипт сталкиваться с ошибкой тайм-аута при прохождении процесса curl? Как насчет того, если данные $ items сейчас около 50 или сотни?

Или есть лучший способ сделать это?

ОБНОВЛЕНИЕ: * Добавлен код основного процесса updateme.php. Дополнительная информация: updateme.php также отправит электронное письмо в зависимости от переданных переменных.

  • Сейчас все остальные сайты размещены на одном сервере.

Ответы [ 2 ]

0 голосов
/ 06 октября 2010

Поскольку скрипт cURL, который вызывает updateme.php, не ожидает ответа, вы должны сделать так, чтобы updateme.php возвратился раньше.

http://gr.php.net/register_shutdown_function

function shutdown() {
    if (!$id = intval(Tools::getValue('id')))
        $this->_errors[] = Tools::displayError('Invalid ID!');
    else
    {
        $history = new History();
        $history->id = $id;
        $history->changeState($newdata1, intval($id));
        $history->id_employee = intval($employee->id_employee);
        $carrier = new Carrier(intval($info->id_carrier), intval($info->id_lang));
        $templateVars = array('{delivery}' => ($history->id_data_state == _READY_TO_SEND AND $info->shipping_number) ? str_replace('@', $info->shipping_number, $carrier->url) : '');
        if (!$history->addWithemail(true, $templateVars))
            $this->_errors[] = Tools::displayError('an error occurred while changing status or was unable to send e-mail to the employee');
    }
}

register_shutdown_function('shutdown');

exit();

Вы можете использовать set_time_limit(0) (0 означает отсутствие ограничения по времени), чтобы изменить время ожидания выполнения скрипта PHP.CURLOPT_TIMEOUT - это опция cURL для установки тайм-аута, но я думаю, что по умолчанию она не ограничена, поэтому вам не нужно устанавливать эту опцию на вашем дескрипторе.

0 голосов
/ 06 октября 2010

У вас может быть проблема с временем выполнения php.
Если у вас есть проблема с тайм-аутом curl, вы можете «исправить» ее, используя опцию CURLOPT_TIMEOUT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...