深入探讨PHP中的多线程实现方法

27,446次阅读
没有评论

共计 2166 个字符,预计需要花费 6 分钟才能阅读完成。

当提到 PHP 中的多线程时,你可能认为这是不可能的。然而,实际上我确实尝试过这么做。

在接下来的内容中,我将分享一些我已经尝试过的方法,它们完全可行。

我们都知道 PHP 本身不支持多线程,但我们的 WEB 服务器支持多线程。

也就是说,我们可以让多个用户同时访问。这是我在 PHP 中实现多线程的基础所在。

假设我们正在运行一个名为 a.php 的文件。但在程序中,我又请求 WEB 服务器运行另一个 b.php。

这样这两个文件将同时执行。

(PS: 一旦链接请求被发送,WEB 服务器会立即执行它,而不管客户端是否已经退出)

有时候,我们想要运行的不是另一个文件,而是本文件中的某一部分代码。要怎么办呢?

实际上,我们可以通过参数控制 a.php 运行哪一段程序。

示例

// a.php
function runThread()
{$fp = fsockopen('localhost', 80, $errno, $errmsg);
    
    fputs($fp, "GET /a.php?act=brnrn"); // 这里的第二个参数是 HTTP 协议中规定的请求头
                                              // 不清楚的话请查看 RFC 中的定义
    
    fclose($fp);
}
function a()
{$fp = fopen('result_a.log', 'w');
    fputs($fp, 'Set in' . Date('h:i:s', time()) . (double)microtime() . "rn");
    
    fclose($fp);        
}
function b()
{$fp = fopen('result_b.log', 'w');
    fputs($fp, 'Set in' . Date('h:i:s', time()) . (double)microtime() . "rn");
    
    fclose($fp);        
}
if (!isset($_GET['act'])) $_GET['act'] = 'a';
if ($_GET['act'] == 'a')
{runThread();
    a();}
else if ($_GET['act'] == 'b') b();

打开 result_a.log 和 result_b.log,比较两个文件中记录的时间。你会发现,这两者确实是在不同的线程中运行的,有时候甚至是完全相同的。

以上只是一个简单的例子,你可以根据需要进行改进。

既然 PHP 中也能实现多线程,那么问题也随之而来,那就是同步问题。我们知道 PHP 本身不支持多线程,更不会有像 Java 中 synchronize 那样的方法了。

那么我们该如何处理呢?

1. 尽量避免访问同一资源,以避免冲突。但是可以同时操作数据库,因为数据库支持并发操作。因此,在多线程的 PHP 中,不要向同一文件写入数据。如果必须这样做,使用其他方法进行同步,例如调用 `flock` 对文件加锁,或者创建临时文件,并在另一个线程中等待该文件消失,类似于 `while(file_exists(‘xxx’));` 这样的做法。这表示当临时文件存在时,表示另一个线程正在操作,而当文件消失时,表示其他线程已经释放了该资源。

2. 尽量避免在执行 `fputs` 后从 `runThread` 中的套接字读取数据。因为要实现多线程,需要使用非阻塞模式。也就是说,在像 `fgets` 这样的函数中立即返回。因此,在读写数据时可能会出现问题。如果使用阻塞模式,程序就不能算是多线程了。它将等待上面的返回后才执行下面的程序。所以,如果需要交换数据,最好利用外部文件或数据来完成。如果一定要这么做,可以使用 `socket_set_nonblock($fp)` 来实现。

那么,这种做法是否有实际意义呢?在什么情况下需要使用这种方法呢?

答案肯定是肯定的。众所周知,在一个持续读取网络资源的应用中,网络速度往往是瓶颈。如果采用多线程的形式,就可以同时对不同页面进行读取。

我开发过一个程序,可以从类似 8848 和 soaso 这样的商城网站搜索信息。还有另一个程序从阿里巴巴网站获取商业信息和公司目录,也用到了这种技术。因为这两个程序都需要不断连接到它们的服务器读取信息并保存到数据库。利用这项技术恰好消除了等待响应时的瓶颈。

希望本文能够帮助你更好地理解在 PHP 中实现多线程的方法以及如何应用于实际场景中。如果您有任何问题或想要进一步探讨,请随时提出。 文章来源地址 https://www.toymoban.com/diary/php/719.html

到此这篇关于深入探讨 PHP 中的多线程实现方法的文章就介绍到这了, 更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持 TOY 模板网!

原文地址:https://www.toymoban.com/diary/php/719.html

如若转载,请注明出处:如若内容造成侵权 / 违法违规 / 事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计2166字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)