Как я могу вызвать curl из скрипта Perl CGI?

У меня есть скрипт CGI (perl), который пытается вызвать curl с помощью команды open:

@curl = ('/usr/bin/curl', '-S','-v','--location', $url, 
                          '-H', 'Content-Type:'.$content_type,
                          '-H', "Authorization: $authorization",
                          '-H', "X-Gdata-Key:$gdata_key",
                          '-H', "Content-Length:$content_length",
                          '-H','GData-Version:2',
                          '--data',"\@$filename");

А затем выполняется так:

open CURL, "-|", @curl;

Программа отлично работает из командной строки, но когда я пытаюсь запустить ее в браузере, страница заканчивается по тайм-ауту.

Что мне нужно изменить на моем сервере или в моем скрипте, чтобы это работало правильно?


person Miriam P. Raphael    schedule 30.11.2009    source источник
comment
Возможно, вы захотите спросить об этом при сбое сервера   -  person JasonWyatt    schedule 30.11.2009
comment
Что в журнале ошибок? Велика вероятность, что в файле $PATH вашего веб-сервера чего-то не хватает.   -  person friedo    schedule 30.11.2009
comment
Это довольно легко сделать на чистом Perl. Есть ли причина, по которой вы хотите использовать curl вместо LWP::UserAgent и т. д.?   -  person brian d foy    schedule 01.12.2009
comment
@brian: Потому что curl лучше!   -  person    schedule 01.12.2009


Ответы (3)


Вы должны проверить, удалось ли open, а также попытаться явно close выполнить канал, проверить наличие ошибок. В случае ошибки die с сообщением об ошибке. Затем найдите сообщение об ошибке в журнале ошибок сервера.

person Sinan Ünür    schedule 30.11.2009
comment
Синан, Спасибо. Я попробовал это, и программа зависла на команде открытия (я пытался выйти и до, и после, чтобы узнать, что зависало в программе). В файле журнала ошибок есть следующее, что я все еще пытаюсь выяснить: [Пн, 30 ноября, 14:59:07 2009] [ошибка] slurp_filename('/var/www/vhosts/mydomain.net/httpdocs/youtube/ youtube.pl') / открытие: (2) Нет такого файла или каталога в /usr/lib64/perl5/vendor_perl/5.8.6/x86_64-linux-thread-multi/ModPerl/RegistryCooker.pm строка 540 - person Miriam P. Raphael; 30.11.2009
comment
@ Мириам Рафаэль Робертс: сообщение об ошибке не имеет ничего общего с кодом в вашем сообщении. В частности, опубликуйте часть кода, которая генерирует сообщение opening. (2) подсказывает мне, что вы оцениваете какой-то массив в скалярном контексте, но невозможно сказать что-то определенное, не видя реального кода. Покажите также функцию slurp_filename (почему вы не используете File::Slurp?) - person Sinan Ünür; 30.11.2009

В дополнение к предложению Синана, тайм-аут, который вы получаете, может указывать на длительный процесс - всегда проблема при запуске под CGI. Пожалуйста, посмотрите на другие решения, такие как диспетчер очередей. В таких случаях я использую Beanstalk. Но я слышал хорошие отзывы о Gearman и Шварц

Я также много узнал о запуске процессов, которые занимают много времени в CGI, из этой статьи< /а>

person Ya. Perelman    schedule 30.11.2009

Просмотрев журнал ошибок и увидев ошибку

[Mon Nov 30 14:59:07 2009] [error] slurp_filename(
'/var/www/vhosts/mydomain.net/httpdocs /youtube/youtube.pl') / opening: (2)
No such file or directory at /usr/lib64/perl5/vendor_perl/5.8.6/
x86_64-linux-thread-multi/ModPerl/RegistryCooker.pm line 540 

Я думал, что это как-то связано с тем фактом, что я передаю свой XML для скручивания в виде файла, а не в виде строки. Вот новая команда, которая вместо этого работает с xml, переданным в виде строки:

@curl = ('/usr/bin/curl', '-S','-v','--location', $url, '-H',
'Content-Type:'.$content_type,'-H',"Authorization: $authorization",'-H',
"X-Gdata-Key:$gdata_key",'-H',"Content-Length:$content_length",'-H',
'GData-Version:2','--data',"$xml");

И я все еще использую команду ниже, чтобы открыть/вызвать curl:

open CURL, "-|", @curl;

Теперь он успешно работает в браузере и возвращает мне значения, которые я запрашиваю.

person Miriam P. Raphael    schedule 30.11.2009