Does PHP have threading?

前端 未结 13 1556
孤城傲影
孤城傲影 2020-11-22 09:39

I found this PECL package called threads, but there is not a release yet. And nothing is coming up on the PHP website.

13条回答
  •  长发绾君心
    2020-11-22 10:28

    In short: yes, there is multithreading in php but you should use multiprocessing instead.

    Backgroud info: threads vs. processes

    There is always a bit confusion about the distinction of threads and processes, so i'll shortly describe both:

    • A thread is a sequence of commands that the CPU will process. The only data it consists of is a program counter. Each CPU core will only process one thread at a time but can switch between the execution of different ones via scheduling.
    • A process is a set of shared resources. That means it consists of a part of memory, variables, object instances, file handles, mutexes, database connections and so on. Each process also contains one or more threads. All threads of the same process share its resources, so you may use a variable in one thread that you created in another. If those threads are parts of two different processes, then they cannot access each others resources directly. In this case you need inter-process communication through e.g. pipes, files, sockets...

    Multiprocessing

    You can achieve parallel computing by creating new processes (that also contain a new thread) with php. If your threads do not need much communication or synchronization, this is your choice, since the processes are isolated and cannot interfere with each other's work. Even if one crashes, that doesn't concern the others. If you do need much communication, you should read on at "multithreading" or - sadly - consider using another programming language, because inter-process communication and synchronization introduces a lot of complexion.

    In php you have two ways to create a new process:

    let the OS do it for you: you can tell your operation system to create a new process and run a new (or the same) php script in it.

    • for linux you can use the following or consider Darryl Hein's answer:

      $cmd = 'nice php script.php 2>&1 & echo $!';
      pclose(popen($cmd, 'r'));
      
    • for windows you may use this:

      $cmd = 'start "processname" /MIN /belownormal cmd /c "script.php 2>&1"';
      pclose(popen($cmd, 'r'));
      

    do it yourself with a fork: php also provides the possibility to use forking through the function pcntl_fork(). A good tutorial on how to do this can be found here but i strongly recommend not to use it, since fork is a crime against humanity and especially against oop.

    Multithreading

    With multithreading all your threads share their resources so you can easily communicate between and synchronize them without a lot of overhead. On the other side you have to know what you are doing, since race conditions and deadlocks are easy to produce but very difficult to debug.

    Standard php does not provide any multithreading but there is an (experimental) extension that actually does - pthreads. Its api documentation even made it into php.net. With it you can do some stuff as you can in real programming languages :-) like this:

    class MyThread extends Thread {
        public function run(){
            //do something time consuming
        }
    }
    
    $t = new MyThread();
    if($t->start()){
        while($t->isRunning()){
            echo ".";
            usleep(100);
        }
        $t->join();
    }
    

    For linux there is an installation guide right here at stackoverflow's.

    For windows there is one now:

    • First you need the thread-safe version of php.
    • You need the pre-compiled versions of both pthreads and its php extension. They can be downloaded here. Make sure that you download the version that is compatible with your php version.
    • Copy php_pthreads.dll (from the zip you just downloaded) into your php extension folder ([phpDirectory]/ext).
    • Copy pthreadVC2.dll into [phpDirectory] (the root folder - not the extension folder).
    • Edit [phpDirectory]/php.ini and insert the following line

      extension=php_pthreads.dll
      
    • Test it with the script above with some sleep or something right there where the comment is.

    And now the big BUT: Although this really works, php wasn't originally made for multithreading. There exists a thread-safe version of php and as of v5.4 it seems to be nearly bug-free but using php in a multi-threaded environment is still discouraged in the php manual (but maybe they just did not update their manual on this, yet). A much bigger problem might be that a lot of common extensions are not thread-safe. So you might get threads with this php extension but the functions you're depending on are still not thread-safe so you will probably encounter race conditions, deadlocks and so on in code you did not write yourself...

提交回复
热议问题