php多线程抓取多个网页(php才算是真正的支持多线程,使用的是pthreads的扩展)
优采云 发布时间: 2022-01-25 13:03php多线程抓取多个网页(php才算是真正的支持多线程,使用的是pthreads的扩展)
到php5.3以上的版本,php确实支持多线程,使用pthreads的扩展,php在处理多个循环任务时可以大大缩短程序的执行时间。
网站的大部分性能瓶颈不在php服务器上,而是在mysql服务器上。因为可以通过横向增加server或者cpu core的数量来处理。如果使用Mysql数据库,联合查询可能会处理非常复杂的业务逻辑,但是遇到大量并发查询时,服务器可能会瘫痪。因此,我们可以使用 NoSQL 数据库代替 mysql 服务器。一个很复杂的SQL语句可能需要几条NOSQL语句才能完成,但是在大量并发的情况下,速度确实非常明显。然后再加上使用php多线程,通过十个php线程查询NOSQL,然后聚合返回结果输出,速度非常快。
1 PHP扩展下载:https://github.com/krakjoe/pthreads
2 PHP手册文档:http://php.net/manual/zh/book.pthreads.php
1、扩展编译安装(Linux),编辑参数--enable-maintainer-zts为必选项:
1 cd /Data/tgz/php-5.5.1
2 ./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
3 make clean
4 make
5 make install
6
7 unzip pthreads-master.zip
8 cd pthreads-master
9 /Data/apps/php/bin/phpize
10 ./configure --with-php-config=/Data/apps/php/bin/php-config
11 make
12 make install
vi /Data/apps/php/etc/php.ini
extension = "pthreads.so"
2、给出一个PHP多线程和For循环爬取百度搜索页面的PHP代码示例:
1
以上是一个官方php多线程的扩展。由于需要重新编译,所以我自己没有测试过,但其实本质是在linux中开启多个线程进行处理。
2、讲一个我自己伪造的PHP多线程的例子:
下面是一段测试代码:
for.php
1
test.php(只显示phpinfo信息):
1
采用多线程的执行的时间:32.89448595047
采用普通的执行的时间:85.191102027893
循环执行的次数越多,这个时间差就越明显。
ps:我们可以写一个python或者shell脚本来实时检测php进程数的变化:
1 #!/usr/bin/env/ python
2 import os
3 from time import sleep
4
5 while 1:
6 os.system("ps -aux|grep php|wc -l");
7 sleep(1);
8
9 上面是一个简单的统计php进程数的一个脚本,在shell界面执行的时候,可以将输出定位到一个文件中。
记录:
最大并发记录数:
在公司机器上运行多线程程序之前,
机器的配置是48G内存6个CPU,
一次并发线程数在3000左右,超过4000会导致内存溢出,机器会死机。这是并发线程的最大数量。
但是当我们在线运行时,为了安全,我们必须记住我们最多会有几十到一百个并发进程。如果超出范围,就会出现数据丢失和一些奇怪的现象。