Edit report at https://bugs.php.net/bug.php?id=44942&edit=1
ID: 44942 Updated by: paj...@php.net Reported by: inqualab1985 at gmail dot com Summary: exec() hangs apache -Status: Duplicate +Status: Assigned Type: Bug Package: Program Execution Operating System: Windows 2000 SP4 PHP Version: 5.2.5 -Assigned To: +Assigned To: pajoye Block user comment: N Private report: N Previous Comments: ------------------------------------------------------------------------ [2012-12-06 12:54:57] paj...@php.net See also #44994 ------------------------------------------------------------------------ [2012-12-05 12:04:02] claudix dot kernel at gmail dot com Seen the same behavior, not only in exec(), but also in similar functions as proc_open/proc_close. When there are concurrent scripts during a same PHP session, the script spawning the process randomly hangs. System: - Windows 2003 server SP2 - Apache 2.2.22/ PHP 5.4.3 I can confirm that calling session_write_close() and then session_start() does the trick. I've observed, though, that the code below doesn't work: $proc = proc_open($cmd,$pipedesc,$pipes); //do stuff with pipes... //... and close pipes session_write_close(); //Close session before hanging function $retval = proc_close($proc); session_start(); //restore session But the code below *does* work: session_write_close(); //Close the session before proc_open() $proc = proc_open($cmd,$pipedesc,$pipes); //do stuff with pipes... //... and close pipes $retval = proc_close($proc); session_start(); //restore session This made me go into the PHP source code (actually the source file "proc_open.c"). I've noticed that the command passed to proc_open() is spawned by calling the WINAPI function CreateProcess(...) with the parameter "bInheritHandles" set to TRUE. As of MSDN documentation, if this parameter is TRUE then all handles are inherited by the child process. It seems that the handle of the session is being inherited by the child process but for some reason the OS doesn't release it when the process ends, eventually yielding a deadlock. The code snippets above show this: the session has to be closed before calling proc_open() to prevent the spawned command from inheriting the session handle. People using exec() cannot see this effect because exec() virtually embeds proc_open/proc_close. May this give a clue to PHP developers? Claudi ------------------------------------------------------------------------ [2012-10-15 15:00:52] mail at GerhardBechtold dot com Pajoye, I didn't find any documentation on the service sensitivity of the new PHP. You might be right, that the eof of the console stream is not taken care properly, but in my case the system is now working (again). ------------------------------------------------------------------------ [2012-10-15 09:12:30] paj...@php.net @mail at GerhardBechtold dot com this is documented, the shell/exec permissions have to be given. However I do not think it is related to the original issue which is caused by a real bug in the php stream, where the eof of the console stream is not correctly detected and ends in an endless loop. ------------------------------------------------------------------------ [2012-10-14 15:28:38] mail at GerhardBechtold dot com After many hours of testing, I managed to solve my problem of exec() calls in PHP. This might be useful also for other developers, as I have seen many struggling with te same problem. 1. xampp must be installed in real (!) administrator mode (in Windows 7 / 32 & 64 bit). 2. In many environments, Apache and MySQL should not run as services, but be manually started (even not with interaction with desktop). I have put a step-by-step procedure to troubleshoot at: http://www.gerhardbechtold.com/LUPMIS/Manual/a15_xamppmap_maker_installation.html (Ignore the references to our system LUPMIS). Good luck to everybody Gerhard ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=44942 -- Edit this bug report at https://bugs.php.net/bug.php?id=44942&edit=1