I’m developing a utility library called meteor-ddp-php, which makes heavy use of PHP pthreads. Once in a while, I encounters weird, unexplainable bugs that contradicts all my knowledge about computer & programming languages. They just really get me on my nerves. I want to share with you that experience in this post.
Suppose I have a class
Thread and a class
A which initiates and starts
Logically, the log I expected is (notice I put a considerable delay in
B::run() - I didn’t use
sleep because it is not thread-safe) :
Be what's next I'm feeling lucky
Instead, this is what I got by running
php test.php :
I'm feeling lucky Be what's next
That’s just weird ! Apparently my child thread is blocking my parent thread, until it terminated. But wait for it. If I move the the
echo line to the end of
startB() method :
it works just fine. Seems like the problem is not that
$b->start() is blocking, but the blocking point is rather at the return of
startB() function !
Now, just for fun, how about I changed the variable
startB() from function-scope to object-scope instead ? It shouldn’t make any difference right ?
Well, it did. The example works as expected, with this little fix. That’s just crazy ! The scope of the variable shoudn’t have anything to do with the blocking thread problem.
Using the second fix between these two, I dodged the bullet and go on with my application.
I must admit I didn’t go over 300+ issues on the github page, and in one of them may lie the answer for all this madness. But still, these problems just demonstrate the myth of multithreading in PHP. PHP isn’t anywhere near thread-safe yet, even at basic language blocs like function call or variable scope it seems. Working with pthreads requires extreme care and patience. Visit here for real-life example.