#php #curl
#php #curl
Вопрос:
Это беспокоит меня уже буквально несколько часов.
Кажется, я не могу понять, почему PHP cURL не загружает данные в файл. (CURLOPT_FILE устанавливается в локальный файл.) Я не получаю никаких данных. Я периодически проверяю размер файла назначения, и он всегда равен нулю. Чтобы дать вам представление, я загружаю файл jpeg размером 90 кб (в целях тестирования).
Это работает на моем локальном компьютере (XP), но не на веб-сайте, над которым я работаю (Windows Server 2003).
Я провел несколько тестов, которые сделали сценарий еще более странным.
-
Я отключил CURLOPT_FILE для печати данных, возвращаемых curl, в стандартный вывод, и напечатал двоичные данные.
-
Сталкиваясь с заблокированными веб-сайтами раньше (поскольку сервер реализует контроль доступа), я попытался получить доступ к файлу из Internet Explorer, и я смог его увидеть.
-
Столкнувшись с заблокированными загрузками ранее, я попытался загрузить файл из Internet Explorer, и он был загружен.
-
Файл создан с помощью 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 , вам может потребоваться настроить права доступа к файлам.