nginx - 对某个网址发送1万个request,那么php会瘫掉吗
大家讲道理
大家讲道理 2017-04-11 10:28:30
[PHP讨论组]

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

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

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(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.

怪我咯

有几台服务器

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号