php - 如何在 PHP 应用程序中使用多线程

标签 php multithreading

是否有一种在 PHP 中实现多线程模型的现实方法,无论是真实的还是只是模拟的。不久前,有人建议您可以强制操作系统加载 PHP 可执行文件的另一个实例并处理其他并发进程。

这样做的问题是,当 PHP 代码执行完毕时,PHP 实例仍保留在内存中,因为无法从 PHP 内部杀死它。因此,如果您模拟多个线程,您可以想象会发生什么。因此,我仍在寻找一种可以在 PHP 中有效地完成或模拟多线程的方法。有什么想法吗?

最佳答案

Warning: This extension is considered unmaintained and dead. Warning: The pthreads extension cannot be used in a web server environment. Threading in PHP is therefore restricted to CLI-based applications only. Warning: pthreads (v3) can only be used with PHP 7.2+: This is due to ZTS mode being unsafe in 7.0 and 7.1.

https://www.php.net/manual/en/intro.pthreads.php

<小时/>

php 可以实现多线程

是的,您可以使用 pthreads 在 PHP 中进行多线程处理

来自the PHP documentation :

pthreads is an object-orientated API that provides all of the tools needed for multi-threading in PHP. PHP applications can create, read, write, execute and synchronize with Threads, Workers and Threaded objects.

Warning: The pthreads extension cannot be used in a web server environment. Threading in PHP should therefore remain to CLI-based applications only.

简单测试

#!/usr/bin/php
<?php
class AsyncOperation extends Thread {

    public function __construct($arg) {
        $this->arg = $arg;
    }

    public function run() {
        if ($this->arg) {
            $sleep = mt_rand(1, 10);
            printf('%s: %s  -start -sleeps %d' . "\n", date("g:i:sa"), $this->arg, $sleep);
            sleep($sleep);
            printf('%s: %s  -finish' . "\n", date("g:i:sa"), $this->arg);
        }
    }
}

// Create a array
$stack = array();

//Initiate Multiple Thread
foreach ( range("A", "D") as $i ) {
    $stack[] = new AsyncOperation($i);
}

// Start The Threads
foreach ( $stack as $t ) {
    $t->start();
}

?>

首次运行

12:00:06pm:     A  -start -sleeps 5
12:00:06pm:     B  -start -sleeps 3
12:00:06pm:     C  -start -sleeps 10
12:00:06pm:     D  -start -sleeps 2
12:00:08pm:     D  -finish
12:00:09pm:     B  -finish
12:00:11pm:     A  -finish
12:00:16pm:     C  -finish

第二次运行

12:01:36pm:     A  -start -sleeps 6
12:01:36pm:     B  -start -sleeps 1
12:01:36pm:     C  -start -sleeps 2
12:01:36pm:     D  -start -sleeps 1
12:01:37pm:     B  -finish
12:01:37pm:     D  -finish
12:01:38pm:     C  -finish
12:01:42pm:     A  -finish

现实世界示例

error_reporting(E_ALL);
class AsyncWebRequest extends Thread {
    public $url;
    public $data;

    public function __construct($url) {
        $this->url = $url;
    }

    public function run() {
        if (($url = $this->url)) {
            /*
             * If a large amount of data is being requested, you might want to
             * fsockopen and read using usleep in between reads
             */
            $this->data = file_get_contents($url);
        } else
            printf("Thread #%lu was not provided a URL\n", $this->getThreadId());
    }
}

$t = microtime(true);
$g = new AsyncWebRequest(sprintf("http://www.google.com/?q=%s", rand() * 10));
/* starting synchronization */
if ($g->start()) {
    printf("Request took %f seconds to start ", microtime(true) - $t);
    while ( $g->isRunning() ) {
        echo ".";
        usleep(100);
    }
    if ($g->join()) {
        printf(" and %f seconds to finish receiving %d bytes\n", microtime(true) - $t, strlen($g->data));
    } else
        printf(" and %f seconds to finish, request failed\n", microtime(true) - $t);
}

关于php - 如何在 PHP 应用程序中使用多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28066173/

相关文章:

php - 在 PHP 中使用 `new ClassName` 和 `new ClassName()` 创建对象的区别

php - Yii + mysql + cloudControlled

php - 根据数据库中的日期选择数据

php - 如何使用 predis 多次发布

java - 锁定写入 HashMap

Java notify() 在 wait() 之前被调用

python - 在多个内核上运行 python 线程

php - 无法使用 PHP PDO 向 MySql 数据库添加值

python 3.5 - asyncio - 运行并发连接池

android - 如何从后台线程向主线程发送位图数据?