首页 > 后端开发 > php教程 > 如何在 PHP 中实现多线程?

如何在 PHP 中实现多线程?

Linda Hamilton
发布: 2024-12-25 06:24:12
原创
551 人浏览过

How Can I Implement Multithreading in PHP?

PHP 中如何使用多线程

引言

在 PHP 中实现多线程模型是否可行,无论是真正实现还是仅仅模拟它。此前,曾有人建议强制操作系统加载 PHP 可执行文件的另一个实例,并处理其他同时进行的进程。

这样做的问题在于,当 PHP 代码执行完成后,PHP 实例仍驻留在内存中,因为从 PHP 中无法将其终止。因此,如果你模拟多个线程,你可以想象将会发生什么。所以我仍然在寻找一种方法,可以在 PHP 中有效地执行或模拟多线程。有什么想法吗?

PHP 中多线程是可能实现的

是的,你可以在 PHP 中使用 pthreads 进行多线程。

根据 PHP 文档:

pthreads 是一个面向对象的 API,提供了在 PHP 中多线程所需的所有工具。PHP 应用程序可以创建、读取、写入、执行和同步线程、工作线程和线程化对象。

警告:
pthreads 扩展无法在 Web 服务器环境中使用。因此,PHP 中的多线程应该仅限于基于 CLI 的应用程序。

简单测试

#!/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);
        }
    }
}

// 创建一个数组
$stack = array();

// 启动多线程
foreach ( range("A", "D") as $i ) {
    $stack[] = new AsyncOperation($i);
}

// 启动所有线程
foreach ( $stack as $t ) {
    $t->start();
}

?>
登录后复制

实际案例

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)) {
            /*
             * 如果请求大量数据,你可能想要使用 fsockopen 和 read,并在读取之间使用 usleep
             */
            $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));
/* 开始同步 */
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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板