exec () проблема с длинной командой в PHP - PullRequest
1 голос
/ 03 августа 2011

Я использую wkhtmltopdf на своем сервере для переноса HTML-документа в PDF. Это работает очень хорошо, когда я использую короткий URL, как:

exec("/opt/wkhtmltopdf/bin/wkhtmltopdf --page-size 'Letter' --orientation 'Portrait' 'http://myurl.com/myPHPfile.php?id=12' '/tmp/myfile.pdf'")

Проблема возникает, когда я использую длинную команду, например:

exec("/opt/wkhtmltopdf/bin/wkhtmltopdf --title 'The name of my file' --page-size 'Letter' --orientation 'Portrait' 'http://myurl.com/myPHPfile.php?phpsid=d8dbfbb91c0748d91426441e67aaf2b6&id=436' '/tmp/The name of my file.pdf'")

Обратите внимание, что когда я запускаю эту длинную команду непосредственно из Putty, она отлично работает.

Проблема в том, что когда я использую exec (или shell_exec () или system () или passthru ()), страница загружается вечно, и мой веб-сервер больше не отвечает. Я должен сам закрыть процесс от Putty (ps -x, а затем убить PID).

Обратите внимание, что если я уберу? Phpsid =, он будет работать хорошо, поэтому я говорю, что проблема возникает только с длинной командой. Если я удаляю? Phpsid = d8dbfbb91c0748d91426441e67aaf2b6 и заменяю его на? Any = ImAmAVeryLongStringThatDoNothing, он тоже не работает.

Я на CentOS 5 использую WHM / cPanel. Заранее спасибо за любую помощь!

Edit:

Я пробовал urlencode (), не работает.
Я пробовал escapeshellarg (), команда правильно прошла, но не работает.
Я пытался использовать короткие параметры, команда правильно прошла, но не работает.

Редактировать 2:

Существует ли ограничение длины строки при использовании exec (), system () или passthru ()?

Редактировать 3:

Наконец, благодаря Wrikken , проблема заключалась в том, что я передавал session_id () в URL, а затем снова использовал его в exec (). Мне пришлось добавить session_write_close (); до моего exec (), поэтому PHP разблокирует текущий сеанс, чтобы сделать его доступным для редактирования сценарием exec () См. Комментарии ниже для получения дополнительной информации.

Ответы [ 2 ]

5 голосов
/ 03 августа 2011

Давайте обновим комментарий до ответа: любой и все аргументы переменной, передаваемые в командную строку, должны быть экранированы с помощью escapeshellarg

1 голос
/ 03 августа 2011

Если командная строка слишком длинная, вы можете использовать сокращенную версию каждого параметра. Например, вместо:

--page-size 'Letter' --orientation 'Portrait' 

вы можете использовать

-s 'Letter' --O 'Portrait' 
...