CURL-запрос неполный, подозреваемый таймаут, но не уверен - PullRequest
4 голосов
/ 16 мая 2010

В настоящее время я использую CURL через php-скрипт, работающий как ежедневный cron, для экспорта данных о продукте в формате csv из административной области сайта.

Обычный способ экспорта данных - перейти на страницу экспорта в браузере, настроить конфигурацию и нажать кнопку «Экспорт данных». Но так как количество экспортируемых продуктов очень велико, а экспорт данных занимает более 5-10 минут, я решил использовать функцию curl в php, чтобы ежедневно имитировать это с помощью cron.

Раньше все работало нормально, но недавно, когда я увеличил количество товаров в магазине на 500+, скрипт не может вернуть экспортированные данные. Тестирование вручную путем нажатия на кнопку «экспорт» в браузере действительно возвращает данные правильно. Таким образом, нет проблемы «тайм-аута» при запуске экспорта в браузере вручную.

Я протестировал и, удалив / уменьшив количество продуктов (таким образом, необходимое время), скрипт php-curl снова отлично работает при запуске из cron.

Так что я подозреваю, что это как-то связано с проблемой тайм-аутов, особенно с функцией curl в php.

Я установил для CURLOPT_TIMEOUT и CURLOPT_CONNECTTIMEOUT значение 0 соответственно, чтобы попробовать. В скрипте php-curl я также установил set_time_limit (3000). Но все равно это не работает, и запрос будет остановлен, так как сценарий не сможет вернуться с полным набором данных CSV.

Буду очень признателен за любую помощь, которая поможет мне решить / понять эту проблему!

Отредактировано: добавлена ​​часть кода, в которой скрипт curl вызывает функцию экспорта.

$interface = new StoreInterface(); 
echo "Start exporting at " .  date('l jS \of F Y h:i:s A') . "\n";
set_time_limit(3000);
$result_html = $interface->exportProducts();
//parse $result_html to only retain the csv format
preg_match('/<pre>(.*)<\/pre>/s',$result_html[0],$output);
if(strlen($output[1])<10) {   //debugging for now
echo "Export did not happen correctly. Quit\n";
    die('Export unsuccessful');
}
file_put_contents($output_path,$output[1]);
echo "Script completed. Thank you! \n";

1 Ответ

2 голосов
/ 17 мая 2010

Вы можете использовать следующие параметры скручивания, чтобы записать все детали переноса скручивания в файл журнала и проверить наличие проблем.

$fp = fopen('./debug/transfer.log');
curl_setopt($curl, CURLOPT_VERBOSE, TRUE);
curl_setopt($curl, CURLOPT_STDERR, $fp);

Также я считаю, что опция CURLOPT_TIMEOUT не поддерживает указание значения «0» для неопределенного времени ожидания. Здесь необходимо указать максимальное значение тайм-аута.

...