对某个网址发送1万个request,那么php会瘫掉吗

几乎同时对某个网址发送1万个含有sql命令的request,让php update1万条数据,php会挂掉吗?还是会一条一条处理?

需要使用队列吗?有多大的意义去使用?

阅读 3.1k
3 个回答

并发嘛

首先 1W个请求,并不会产生1W个fpm,具体你可以看下fpm的配置,有最大进程数限制的。后面的请求就被舍弃了,报错502,应该很常见吧?

就算你有资源容纳1W个进程处理,其实PHP运行速度还是挺快的,就是每次初始化耗时而已,逻辑处理很快就结束了,链接mysql吧,mysql能同时容纳1W个链接吗?报错吧,sql错误。

PHP和mysql都支持了,那就没话说了,肯定不会瘫。

按照你的服务器资源(1台),建议还是队列,最好还是单例模式,这样不会太影响其他业务。

如果用队列还可以优化啊,1W次请求的数据都拿出来合并,一次性全部更新完不可以?合并成几次(小于1W)不可以?

PHP哪有那么容易挂掉,在我的笔记本Ubuntu(i5-3230M)上用PHP内置的单进程HTTP服务器insert/select读写Linux内存文件系统上的SQLite,每秒处理请求数(RPS)都能达到2660,1万个这样的请求不到4秒就能处理完.下面就是测试代码,功能是用内存级SQLie实现一个队列.

<?php
$file = '/dev/shm/app/data.db3'; //保存在Linux内存文件系统上的SQLite
$ddl = "
BEGIN;
CREATE TABLE IF NOT EXISTS queue (
    id           INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id      INTEGER
);
COMMIT;
";
if(!file_exists($file)) {
    $db = new PDO('sqlite:'.$file);
    $db->exec($ddl);
} else {
    $db = new PDO('sqlite:'.$file);
}
$user_id = time(); //time()换成你的用户ID,真实环境user_id字段需要加入UNIQUE唯一约束.
$stmt = $db->prepare('INSERT INTO queue(user_id) VALUES(?)');
$stmt->execute(array($user_id));
echo 'rowCount:'.$stmt->rowCount()."\n";        //查询中受影响(改动)的行数,插入失败时为0
echo 'lastInsertId:'.$db->lastInsertId()."\n";  //插入的自增ID,插入失败时为0
$stmt = $db->query('SELECT * FROM queue WHERE id = '.$db->lastInsertId());
var_export($stmt->fetchAll(PDO::FETCH_ASSOC));
// PHP内置的单进程HTTP服务器
// php -S 127.0.0.1:8080 -t /home/eechen/www >/dev/null 2>&1 &
// ab并发100测试5000个请求
// ab -c100 -n5000 http://127.0.0.1:8080/

树莓派(BCM2709)上RPS为185,如果SQLite不在内存上而在SD卡上RPS会降到30.

有几台服务器

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题