PHP curl не загружает данные при выводе в файл, но нормально при печати в стандартный вывод

#php #curl

#php #curl

Вопрос:

Это беспокоит меня уже буквально несколько часов.

Кажется, я не могу понять, почему PHP cURL не загружает данные в файл. (CURLOPT_FILE устанавливается в локальный файл.) Я не получаю никаких данных. Я периодически проверяю размер файла назначения, и он всегда равен нулю. Чтобы дать вам представление, я загружаю файл jpeg размером 90 кб (в целях тестирования).

Это работает на моем локальном компьютере (XP), но не на веб-сайте, над которым я работаю (Windows Server 2003).

Я провел несколько тестов, которые сделали сценарий еще более странным.

  1. Я отключил CURLOPT_FILE для печати данных, возвращаемых curl, в стандартный вывод, и напечатал двоичные данные.

  2. Сталкиваясь с заблокированными веб-сайтами раньше (поскольку сервер реализует контроль доступа), я попытался получить доступ к файлу из Internet Explorer, и я смог его увидеть.

  3. Столкнувшись с заблокированными загрузками ранее, я попытался загрузить файл из Internet Explorer, и он был загружен.

  4. Файл создан с помощью fopen(«, ‘w’), но размер остается равным 0. Несмотря на это успешное создание файла, я подумал, что, возможно, у PHP проблема с правами на запись в файловую систему, я настроил exe для запуска даже пользователями, не являющимися администраторами. По-прежнему нет загрузки.

С кем-нибудь такое когда-нибудь случалось?

Любые указания будут оценены. Я действительно застрял.

Спасибо.

Вот параметры curl, которые я установил:

 $connection = curl_init($src);

// If these are not set, curl_exec outputs data.
// If these are set, curl_exec does not send any data to the file
// pointed to by $file_handler. $file_handler is not null
// because it is opened as write (non-existing file is created)

curl_setopt($connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt( $connection, CURLOPT_FILE, $file_handler );
  

PS: Я выполняю эти тесты, используя командную строку, а не браузер.

Комментарии:

1. Я все еще не могу в этом разобраться. В то же время я сам сохранил данные в файл. Байты были возвращены из curl, поскольку для параметра RETURNTRANSFER установлено значение true. Они были записаны в файл с помощью fwrite. Хотя я действительно хотел избежать этого и позволить cURL выполнять буферизацию (если таковая имеется).

Ответ №1:

возможно, у вас нет прав на запись в файл.

Комментарии:

1. также проверьте версию php. в зависимости от версии php curl иногда может давать сбой (другой метод, что угодно, или дополнительные опции, добавленные по пути. затем проверьте, какой уровень php имеет при записи в файл, запущен ли он каким пользователем и есть ли у этого пользователя разрешения. вы всегда можете коснуться файла и отредактировать его перед записью, чтобы действительно убедиться, измените его на 777

Ответ №2:

Я не думаю, что вам нужно устанавливать CURLOPT_RETURNTRANSFER, и если вы запускаете из командной строки, обязательно запустите php с правами администратора. Не уверен, как это работает в Windows, но в Linux я всегда выполняю sudo при каждом запуске скрипта командной строки.

Также, если включен безопасный режим php, обязательно укажите каталогу того же владельца (UID), что и файл php. Хм, но поскольку вы можете создать файл (с размером файла 0), это может не иметь никакого отношения к правам … не могли бы вы проверить настройку * open_basedir * php на вашем сервере? Если он установлен, cUrl не разрешается использовать файловый протокол… вы проверяли файлы журналов со своего сервера? возможно, произошла ошибка.

Ответ №3:

Возможно, вам потребуется выяснить, какой пользователь запускает ваш php, если пользователь, выполняющий php-скрипт (тот, который вызывает php), не авторизован для записи в каталог файла или в /path/to/file , вам может потребоваться настроить права доступа к файлам.