curl останавливает выполнение скрипта - PullRequest
3 голосов
/ 02 февраля 2010

Мой скрипт использует curl для загрузки изображений на сайт smugsmug через smugsmug api . я зацикливаюсь на папке и загружаю каждое изображение там. но после 3-4 загрузок curl_exec завершится ошибкой, остановит все и не сможет загрузить другие изображения.

$upload_array = array(
    "method" => "smugmug.images.upload",
    "SessionID" => $session_id,
    "AlbumID" => $alb_id,
    "FileName" => zerofill($n, 3) . ".jpg",
    "Data" => base64_encode($data),
    "ByteCount" => strlen($data),
    "MD5Sum" => $data_md5);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $upload_array);
curl_setopt(
    $ch, CURLOPT_URL, 
    "https://upload.smugmug.com/services/api/rest/1.2.2/");
$upload_result = curl_exec($ch); //fails here
curl_close($ch);

Последнее обновление: поэтому я добавил вход в мой скрипт. когда происходит сбой, запись останавливается после fwrite ($ fh, "begin curl \ n");

fwrite($fh, "begin curl\n");
$upload_result = curl_exec($ch);
fwrite($fh, "curl executed\n");
fwrite($fh, "curl info: ".print_r(curl_getinfo($ch,true))."\n");
fwrite($fh, "xml dump: $upload_result \n");
fwrite($fh, "curl error: ".curl_error($ch)."\n");

я тоже

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60*60);

Ответы [ 5 ]

3 голосов
/ 02 февраля 2010

Не уверен, в чем проблема ... Что находится в ответе, когда он терпит неудачу? Что говорят системные журналы и журналы Apache?

Теперь, если бы я был тобой, я бы не использовал curl_init() и curl_close() в цикле. вместо этого я бы инициировал до цикла и закрывал после цикла - тогда внутри цикла я бы использовал curl_set_opt, чтобы установить URL и отличающиеся параметры, и просто вызвать curl_exec(). Возможно, дело в том, что все эти дескрипторы превышают какой-то системный предел или что-то в этом роде. Если вам нужно / вы хотите использовать несколько соединений, вы можете использовать curl_multi или написать некоторые функции / класс управления для управления несколькими дескрипторами.

1 голос
/ 02 февраля 2010

Нам может потребоваться дополнительная информация, прежде чем мы сможем помочь, но, похоже, это может быть проблема с тайм-аутом.

Включите отчеты об ошибках или проверьте свои журналы ошибок, чтобы видеть, поднимается ли что-нибудь.

Попробуйте установить длительное время ожидания cURL с помощью CURLOPT_TIMEOUT

Также убедитесь, что время ожидания вашего сценария достаточно или увеличено с set_time_limit()

0 голосов
/ 11 февраля 2010

1 - заставьте Curl рассказать вам немного больше о том, что он делает

curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_HEADER, true);

2- Если вы не в безопасном режиме, убедитесь, что PHP отображает ошибки, поместив это в начало вашего скрипта:

<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);

3 - Вы также можете попробовать запустить скрипт в режиме CLI.

4- Наконец, если вы не в безопасном режиме, вы можете попробовать запустить двоичный файл curl с помощью exec ().

<?php

$curl_str = "curl -k -o /my/path/curl_output.log -d 'var1=".$value1."&var2=".$value2."& etc...' https://upload.smugmug.com/services/api/rest/1.2.2/";
$r = exec($curl_str);
0 голосов
/ 11 февраля 2010

CURL включает опции 'multi' (для нескольких ресурсов), когда кто-то имеет дело с несколькими запросами с высокой задержкой (такими как загрузка изображений).

См: http://www.php.net/manual/en/function.curl-multi-exec.php и вся библиотека 'multi' функций, описанных здесь: http://php.net/manual/en/book.curl.php

Полный пример раздела с несколькими ресурсами библиотеки см .: http://www.developertutorials.com/blog/php/parallel-web-scraping-in-php-curl-multi-functions-375/

0 голосов
/ 06 февраля 2010

Вы можете попробовать, работает ли вывод curl_error () напрямую:

$upload_result = curl_exec($ch); //fails here

$error = curl_error($ch();    
if ($error) echo "CURL Error: $error";

curl_close($ch);

Если это не поможет, проверьте phpinfo();, чтобы увидетьотчеты об ошибках отключены глобально (ищите параметр display_errors).

...