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连续发个几百个需要几十秒甚至更多,所以数据库加锁影响不大。

posted on 2016-04-07 15:21  allen__  阅读(10903)  评论(0编辑  收藏  举报

导航