Вопрос по curl в php
1594 сообщения
#15 лет назад
Возникла проблема с работой cURLПри подключении сервер возвращает код 302.
Включаю CURLOPT_FOLLOWLOCATION. Скрипт ругается:
Цитата:
CURLOPT_FOLLOWLOCATION cannot be activated when in safe_mode or an open_basedir is set
Я, не долго думая, пишу в .htaccess
php_flag safe_mode off
Результат - тот же самый... То, что проблема в open_basedir - сомневаюсь, т.к скрипт файлы вообще не использует, на данный момент.
Вопрос: а в чем тогда проблема? Разве CURLOPT_FOLLOWLOCATION использует файлы?
Техподдержка хостера упорно заявляет, что safe_mode по умолчанию отключен (угу, как же, включен он. С чего бы тогда файлы созданные php скриптами по умолчанию принадлежат Apache и вручную я удалить их не могу) и проблема в open_basedir.
Цитата:
К сожалению параметр open_basedir не менятся, в данном случае ошибка касается именно его, safe_mode - не активен по умолчанию, и тоже параметр не изменяется.
1172 сообщения
#15 лет назад
Если хостер в своем конфиге запрещает менять safe_mode, то его изменение на off не работает ни в .htaccess, ни в php.iniКстати, можете попытаться объяснить им, что использование safe mode - это признание собственной ущербности как системных администраторов и попытка переложить проблему сетевой безопасности на PHP.
Тем более, цитирую "Safe Mode is deprecated in PHP 5.3.0 and is removed in PHP 6.0.0."
65 сообщений
1594 сообщения
#15 лет назад
Спасибо, пришлось правда немного эту функцию переделать, т.к она немного некорректно работает с Cookie, но это было именно то что надо!
1594 сообщения
#15 лет назад
Кстати, еще такой вопрос, сюда же задам =)Парсер гуляет по 500 страницам...
Приходится в скрипте прописывать, если по русски: Сначала с 1 по 100-ую. Запускаем, сохраняем данные. Потом редактируем скрипт: с 100 по 200 и т.д...
Проблема в том, что если запустить сразу по 500 страницам, без ограничения, сервер, на который заливаю парсер, выдаёт HTTP-шлюз не отвечает (код ошибки: 504)... То есть долговато скрипт работает и сервер его принудительно завершает
Можно это как то вылечить, или все так работают? =)
11416 сообщений
#15 лет назад
Отключить safe mod и убрать ограничение на время исполнения файла 
65 сообщений
#15 лет назад
Если сейф мод выключен то:В начале скрипта
set_time_limit(0);
ignore_user_abort(true);
и в цикле по страницам на случай если нужно остановить скрипт
if(file_exists('stop-file)) die();
Для остановки создается файл stop-file в папке со скриптом
Этот вариант иногда не работает, чаще всего если стоит nginx
Тогда как выход можно сделать скрипт start.php
<?php
exec('php /path/to/parser.php >> /dev/null &');
?>
Получим файл, который скрипт запускает через php-cli
1594 сообщения
#15 лет назад
Спс огромное =)Решил освоить новую для себя отрасль - парсеры, но вот ряд трудностей возникает =)
Спасибо всем за ответы!
1594 сообщения
#15 лет назад
Кстати, вопрос вдогонку, а можно, чтобы парсер хоть какие то данные выдавал "в процессе"? Чтобы быть уверенным, что он работает, а не висит?
1594 сообщения
#15 лет назад
Блин, safe_mode судя по всему включен, а на функцию exec() запрет стоит =( =( =(
11416 сообщений
#15 лет назад
Цитата ("Anexroid"):а можно, чтобы парсер хоть какие то данные выдавал "в процессе"? Чтобы быть уверенным, что он работает, а не висит?
Можно, конечно

Цитата ("Anexroid"):
safe_mode судя по всему включен
Просите хостеров отключить, если это возможно на Вашем хостинге и тарифном плане
1594 сообщения
#15 лет назад
Цитата ("Hungry_Hunter"):Отключить safe mod и убрать ограничение на время исполнения файла
Hungry_Hunter, я б с радостью, будь сервер мой =) Купите мне data-center? =)
1594 сообщения
#15 лет назад
Цитата ("Hungry_Hunter"):Просите хостеров отключить, если это возможно на Вашем хостинге и тарифном плане
Невозможно на моём хостинге... При этом техподдержка уверяет, что он выключен по умолчанию...
11416 сообщений
#15 лет назад
Ну раз говорят что выключен, значит выключен 
578 сообщений
#15 лет назад
Сейф мод это вообще бич при написании скриптов типа граберов etc.-----------
кстати если столкнетесь с препятствиями от сейф-мода при работе с файловой системой ставьте в начале скрипта директиву
ini_set('safe_mode_gid', 1);- она смягчает strict проверку на принадлежность файла владельцу.
-----------
имхо делать граб работающий в один проход при значительных объемах инфы нецелесообразно. больше вероятность перенапрячь или донора или свой хост (не знаю, сталкивались ли вы с 502 ошибкой когда ngnix бастует). как тогда он будет работать? оч просто. текущую инфу (например счетчик пройденых страниц и список оставшихся) он может дампить в файл, и при следующем запуске считывать и продолжать работу. как реактивировать скрипт в таком случае? ну например сделайте html-страничку, которая через аякс будет запускать скрипт с нужными парааметрами столько раз сколько нужно. есть еще проще и намного красивей вариант но до него вы уж догадайтесь сами.
кстати, именно при такой организации скрипта (когда он грабит порциями и завершает сеанс работы) можно организовать вывод информации на экран (будь это просто краткая инфа о прогрессе или хоть дебаг и трэйс важных внутренних переменных.
1594 сообщения
#15 лет назад
vladmax, спасибо за подсказку, буду делать =)Для начал надо простенькую HTML+AJAX оболочку написать, как я понял...
А данные у меня грабятся не в файлы, а в БД, т.к потом проще CSV формировать =)
578 сообщений
#15 лет назад
Цитата ("Anexroid"):А данные у меня грабятся не в файлыэт гуд, но я о передаче параметров между сеансами запуска грабера.
----
например допустим у вас грабер парсит выдачу яндекса, первые 1000 снипетов (значит первые 10 страниц).
допустим (на самом деле это не так) вы решили, что лптимально за 1 запуск отрабатывать 1 страницу выдачи.
--
пусть поисковое слово - "curl"
тогда вам надо заполучить контетнт 10 адресов -
http://yandex.ru/yandsearch?p=0&text=curl&lr=213
http://yandex.ru/yandsearch?p=1&text=curl&lr=213
http://yandex.ru/yandsearch?p=2&text=curl&lr=213
....
http://yandex.ru/yandsearch?p=10&text=curl&lr=213
--
соответственно при первом запуске вы отработаете 1 урл, при 2м - 2й и тд
как граб узнает что какой номер страницы обрабатывать в очередной раз?
вот эту циферку (от 1 до 10) и пишем в файл при завершении нграбера и читаем при старте.
--
конечно это более актуально для кронового грабера, который имеет
независимые вызовы отдельных сеансов. а грабер работающий десктопно, через браузер
безусловно можно сделать просто самовызывающимся (типа пайпа).
завершаясь грабер (черрез тот же курл например) вызывает себя же (как внешний ресурс, по УРЛу), и передает все параметры в GET-запросе...