我们知道PHP本身是不支持多线程的, 但是我们的WEB服务器是支持多线程的.
也就是说可以同时让多人一起访问. 这也是我在PHP中实现多线程的基础.
假设我们现在运行的是a.php这个文件. 但是我在程序中又请求WEB服务器运行另一个b.php
那么这两个文件将是同时执行的.
(PS: 一个链接请求发送之后, WEB服务器就会执行它, 而不管客户端是否已经退出)
有些时候, 我们想运行的不是另一个文件, 而是本文件中的一部分代码.该怎么办呢?
其实可是通过参数来控制a.php来运行哪一段程序.
下面看一个例子:
//a.php
PHP代码:--------------------------------------------------------------------------------
<?php
function runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=b\r\n\r\n"); //这里的第二个参数是HTTP协议中规定的请求头
//不明白的请看RFC中的定义
fclose($fp);
}
function a()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "\r\n");
fclose($fp);
}
function b()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "\r\n");
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_exits('xxx')); 这样就等于这个临时文件存在时, 表示其实线程正在操作
如果没有了这个文件, 说明其它线程已经释放了这个.
2. 尽量不要从runThread在执行fputs后取这个socket中读取数据. 因为要实现多线程, 需要的用非阻塞模式. 即在像fgets这样的函数时立即返回.. 所以读写数据就会出问题. 如果使用阻塞模式的话, 程序就不算是多线程了. 他要等上面的返回才执行下面的程序. 所以如果需要交换数据最后利用外面文件或数据中完成. 实在想要的话就用socket_set_nonblock($fp) 来实现.
说了这么多, 倒底这个有没有实际的意义呢? 在什么时候需要这种用这种方法呢 ?
答案是肯定的. 大家知道. 在一个不断读取网络资源的应用中, 网络的速度是瓶颈. 如果采多这种形式就可以同时以多个线程对
不同的页面进行读取.
本人做的一个能从8848、soaso这些商城网站搜索信息的程序。还有一个从阿里巴巴网站上读取商业信息和公司目录的程序也用到了此技术。 因为这两个程序都是要不断的链接它们的服务器读取信息并保存到数据库。 利用此技术正好消除了在等待响应时的瓶颈。
分享到:
相关推荐
在Windows等其他平台上,可能需要使用其他方法,如`pcntl_fork()`函数来模拟多线程效果,但这实际上是创建了子进程而非线程。 `PHP_Fork-0[1][1].3.0.rar`这个压缩包可能包含关于使用`pcntl_fork()`函数的示例代码...
在提供的代码示例中,作者通过实现一个简单的多进程管理机制来模拟多线程行为。这段代码主要分为两部分:进程管理类`my_process_base`及其派生类`pp`,以及初始化和管理这些进程的主程序。 ##### 进程管理类`my_...
在PHP中实现多线程处理图片是一项挑战,因为PHP本身并不支持原生的多线程。但是,通过一些技巧和扩展,我们可以模拟实现多线程的功能。本篇将深入探讨如何利用CURL扩展来实现这一目标,以及在这个过程中可能遇到的...
文章中通过实例演示了如何使用PHP脚本来模拟多线程。通过使用不同的GET参数来区分不同的并发处理,比如通过不同的act参数来指定不同的函数执行: ```php <?php if(function_exists('date_default_timezone_set')){ ...
这是一个经典的curl模拟多线程操作,缺点是总耗费时间取决于最慢的一个响应,网上有很多,只是用代码实现了一下,这是一个获取搜狗rank的示例
本文将详细介绍PHP模拟多线程实现秒杀抢单的过程和关键技术点。 首先,模拟多线程的思路通常是为了实现并发请求的处理。秒杀系统通常面临的挑战是高并发访问,即在短时间内有大量用户同时发起对某一商品的秒杀请求...
在实际应用中,如果要使用PHP模拟多线程发送请求,需要考虑到请求的数量、服务器的承载能力、以及网络延迟等因素。此外,频繁的网络请求可能会对服务器造成较大压力,甚至可能触发服务器的安全设置,导致请求被拒绝...
为了提高性能,我们可以利用`cURL`的多会话特性以及PHP的多进程或多线程功能来实现并行采集。 ### PHP中的cURL多线程采集原理 1. **多会话并发**:`cURL`支持同时开启多个会话(`multi handle`),每个会话可以...
1. **模拟多线程:使用`exec`函数** 在PHP中,由于其本身不支持原生的多线程,可以通过`exec`函数来模拟多进程,从而实现类似多线程的效果。在给定的示例中,`exec`函数被用来执行另一个PHP脚本`static_massive....
通过在PHP脚本中调用shell命令,可以启动多个子进程,每个进程可以执行不同的任务,从而模拟多线程的效果。例如,可以使用`popen`或`exec`函数来启动多个命令行进程。这种方法的优点在于简单易用,但缺点是进程间...
标题中提到的“PHP三种实现多线程类似的方法”主要关注在PHP中如何通过不同手段模拟多线程的运行效果。由于PHP本身不是为多线程而设计的,它是一种基于请求的脚本语言,通常在每次请求处理完毕后,该请求所使用的...
php模拟多线程用到curl库,这个库很强大,可以做好多事,比如模拟登陆,文件上传/下载,数据采集等。 下面是我的代码,很简单,有些还功能还不会用。 <?php $node_urls=array('http://www.baidu.com','...
总的来说,PHP的cURL多线程采集是一种提高数据采集效率的方法,通过结合`pthreads`扩展和cURL库,可以在PHP中实现高效且灵活的网络数据获取。在实际使用中,需要根据具体需求进行调整和优化,确保程序的稳定性和效率...
不过,PHP社区已经开发出了多种策略来模拟多线程行为,通过这些策略可以实现程序的不同部分并行执行,而无需等待其他部分完成。 第一种策略是使用多进程。在PHP中,可以通过`pcntl`扩展来实现多进程,或者在命令行...
SimpleFork提供一套类似于JAVA多线程的进程控制接口,提供回收、同步、互斥、通信等方案,开发者可以关注业务问题,不需要过多考虑进程控制。 引入 composer require jenner/simple_fork require path/to/...
在PHP中,我们可以利用cURL库来实现多线程数据抓取,这在处理大量网页数据或者需要同时从多个来源获取信息时非常有用。本文将详细介绍如何使用PHP结合cURL进行多线程抓取。 首先,cURL是一个客户端URL传输库,支持...
总结来说,虽然PHP本身并不直接支持线程,但开发者可以借助`stream_select`、`stream_socket_client`等函数实现并发处理,模拟多任务执行。另外,通过Ajax和PHP/TK这样的技术,也可以在特定场景下实现并发,提升PHP...
在PHP中,多线程操作通常不是一种标准的特性,因为PHP主要被设计为单线程脚本语言。然而,通过扩展如Pthreads,我们可以实现PHP的多线程功能。Pthreads是为PHP设计的一个多线程扩展,它允许开发者在PHP环境中创建和...