关于PHP多线程,我们会遇到很多问题,下面这篇文章就是关于PHP多线程的小项目问题,同时我们提供了三种解决方案,请参考。

项目情况:

要同步300W+的用户数据到qcloud,只能每次一个curl同步,大概每秒同步3个,算下来同步完300W数据估计要10天+,所以想到用多线程解决。

方案1:

用c++写多进程方案,fork多个进程出来解决。主线程负责读取/存储数据,子线程负责curl。

方案2:

用php写多进程方案,同方案1.主线程读取,子线程curl。

但是由于php没有多进程,不能直接操控线程/进程。所以只能依赖于linux来实现多进程。

php函数pcntl_fork()可以创建进程,等同于linux的fork。

和fork不同的是,pcntl_fork返回的0是子进程,返回的id是子进程的pid(而fork是父进程返回0,子进程返回ppid).

注意pcntl_fork()函数必须要在linux上面才行,据说要加载pcntl.so模块,但貌似不加载也行。

方案3:

php+shell模拟多线程

例如:test.php文件实现了项目所需功能(包含数据库读写和curl)

再写一份shell如下,保存为start.sh:

#!/bin/bash  //指定bash,必须for(( i=0; i<20; i++))do
    php test.php &    //执行test.php,&符号的意思是把该操作放在后台执行,这样shell就可以继续执行下一步sleep命令了。如果没有这个符号,shell会阻塞在这里。
    sleep 1s
done
登录后复制

最后执行该shell,sudo ./start.sh

shell会启动20个进程同时分别执行test.php

但是由于每个进程都相当于主进程,所以共同的资源不好控制,这个case中,共同的资源只有数据库,所以每次操作数据库我都加锁详见我另一篇文章。mysql lock。 因为相对于数据库操作基本都是每秒能解决,而curl连续发个几百个需要几十秒甚至更多,所以数据库加锁影响不大。

总结:虽然这只是一个关于PHP多线程的小案例,但是希望大家可以开动大脑,也希望这篇文章能给大家带来解决此类问题的思路。

相关推荐:

java - pthreads是PHP多线程的东西。

socket - 使用php多线程 , 多进程

PHP中多线程的两个实现方法


以上就是PHP多线程小案例的详细内容,更多请关注Work网其它相关文章!

09-17 10:40