2014-07-21 4 views
1

현재 PHP의 proc_open 기능을 사용하는 Symfony Process 구성 요소를 사용하고 있습니다. 나는이 양식이있는, wkhtmltopdf에 명령을 실행해야합니다 나는 내 껍질에 직접 명령을 실행하면PHP proc_open 및 exec timeout하지만 cli가 정상적으로 작동합니다.

/usr/local/bin/wkhtmltopdf --window-status "___RENDER_PDF___" --orientation "portrait" --run-script "window.basilOptions = {storages: ['memory'] }; document.body.addEventListener('status:app:rendered', function() { window.status = '___RENDER_PDF___'; });" "http://localhost/p/lps#poll/lpsp002" "/tmp/pdf_d6fbWO"` 

, 그것은 잘 작동하고 약 6 초 실행하는 데 많은 시간이 소요됩니다. 그러나 프로세스 구성 요소와 함께 PHP를 사용하면 시간 초과가됩니다 ... 그리고 exec 또는 proc_open 함수를 사용하면 무한정 실행됩니다. 프로세스 구성 요소의 기본 시간 초과는 60 초입니다 (심지어 확장해도 효과가 없습니다).

나는 이것을 PHP 5.4와 PHP 5.5에서 시도했지만, 결과는 같았다.

이 명령이 셸에서는 정상적으로 실행되지만 PHP에서는 정상적으로 실행되지 않는 이유는 무엇입니까? MAMP 환경 (5.4 및 5.5 버전)이 아닌 MAMP에서 테스트되었습니다. 그것은 우분투 14.04에서 PHP 5.5와 함께 작동합니다.

PHP와 MAMP를 통과 할 때 프로세스가 완료 될 수 있지만 여전히 this bug으로보고 된 것처럼 멈춘 것으로 생각했습니다. PDF가 실제로 생성되는지 여부를 확인하기 위해 추가 정보가 필요할 때 업데이트 할 것입니다.

감사합니다.

+0

왜 당신은 그냥 사용하지 않는 렌더링 후 session_start();를 추가하려면 - HTTP : //knpbundles.com/KnpLabs/KnpSnappyBundle? – dmnptr

+0

Symfony Process 구성 요소를 직접 사용하는 것이 더 빠르며, 약간의 매개 변수를 먼저 만들어야합니다. 그러나 문제는 어쨌든 똑같을 것입니다 ... – Talus

답변

2

문제는 세션 잠금으로 인해 발생할 수 있습니다. 현재 PHP 페이지 스레드는 세션을 쓰기 위해 잠급니다. 따라서 동일한 서버의 다른 페이지가 세션을 잠금 해제 (sessions_start() 기능)하여 요청을 처리 (PDF로 덤프) 할 때까지 기다립니다. 이것은 기본적으로 세션이 다른 스레드에 대한 쓰기 잠금으로 시작하기 때문에 데드 록을 만듭니다.

명령 전에 session_write_close();을 추가하여 쓰기이 세션 교착 상태, 가까운 세션을 방지하고 다시 PDF 렌더링 직후 세션에 기록해야하는 경우 KnpSnappyBundle PDF가