I am attaching a new version of my patch. The old one could deadlock under certain circumstances under new PHP versions because the behavior of fread() has changed. With the new PHP behavior fread() will wait until it has read the number of bytes you wanted to read.
This new patch solves this by using fgets() instead of fread().
I have reimplemented safe_read_message to fix various bugs. The original function does a busy-read on a non-blocking socket. Even though the implementation tries to usleep() in between it is still a busy loop. It manages to eat 80% CPU on my AMD quad-core just waiting for reserve() to return a job.
This new implementation preserves the features of the original and fixes a couple of other bugs.