最近发表的话题
最近发表的评论
  • [Laravel Dinner 线下聚会第 8 期][长沙] 线下聚会开始报名啦 at 2个月前

    杭州有么

  • 前端资源过大,app.js 文件达到 1m 多,package 并没有加入多少东西,可就是压缩不下去,这是为什么呢? at 6个月前

    @旺仔小馒头 刚刚@错人了 重新发一次。 其实我觉得1MB左右的大小对于一整个单页应用来说,并不算特别大的,且加载一次之后,后面都不用再有JS了

    file

    而且大多数情况下,用户的浏览器都会缓存到。如果是复杂应用的话,拆成多个单页应用就好了。

    file

  • Nginx 配置实现 CORS at 6个月前

    我在使用使用Passport的时候遇到了cros相关的问题,已经发到github上了,有不有愿意帮忙看一下?

  • Laravel 性能问题始终难以释怀,求指点 at 6个月前

    能不能有编辑功能.@Summer
    HTTP CODE 304写成 302 了
    好丢脸 >///<

  • PHPHub5 安装出现错误,前台可以访问后台打不开 at 6个月前
    这个位于公司、组织或学校内网中的网站使用的网址与某个外部网站的网址相同。

    是不是应该检查一下DNS服务的问题呢?

  • Laravel 性能问题始终难以释怀,求指点 at 6个月前

    时隔一年,看到题主今日还在此主题活动,作为将Lumen搬上生产环境的我谈谈我对此的看法。如果说的不好,希望大家对我这个后辈多点宽容。

    不得不说,题主所说的情况是存在的。Laravel使用php-fpm比市场上某些框架显得性能"不够强劲"。
    Laravel执行速度不及Yaf这样使用C语言框架;I/O模型也不如yii2 swoole2 Zan Framwork这样的swoole框架。这些框架存在且有人用,就有他们存在的道理~但是他们也要认清一个事实,Laravel是目前最受PHPer欢迎的框架。我们不快但是我们开发速度高效;我们并发不高,但是我们...,我们优雅啊!

    file

    使用世界上最好的语言最受欢迎的框架(自嘲),难道不应该有一种自豪感吗,为什么说服不了自己呢?不过这个主题已经是一年之前了,如果题主还没有选择好框架的话,正如之前的回答一样估计项目也早就凉了。

    我回国毕业之后赶上了猎豹移动旗下的一个电商平台刚刚成立,于是就在这里开始了第一份工作,到现在也一年半了。你们在手机上安装的猎豹浏览器、猎豹清理大师、金山电池医生、万年历、百思不得姐等猎豹移动旗下的App中,都会带上我们的电商SDK。也就是你们平时在我们这里看到的商城以及卖鞋子、情趣用品的牛皮藓其实都是我们搞的(这里先和用过的朋友们说声不好意思)。我们对流量的承载能力、数据反回的时间是有高要求的。

    file

    我知道,稳定性、鲁棒性、性能的问题已经困扰了大家很久。PHP一直被诟病不稳定,相较Java而言抗不了高并发。我知道我一年半之前Java写的流计算服务在线上还跑得又稳又准;可是一个礼拜之前部署的PHP爬虫,我都不知道这个点进程是否还活着,是不是已经好几天没有执行了。

    我们的流量到底有多少呢?这么说吧,单猎豹清理大师一个App,实际有1000多万日活(公司号称4000万),首页打开PV每天有1.5亿。而这些埋点都会通过HTTP请求到达我们的服务器。试问,有多少人敢说,你们的TP5Yii2能接住这样的请求?如果能接住,你们算一算一共要多少台机器?每个月要花多少钱?

    那么PHP适合这种场景吗?答案是肯定的。这种IO密集型的案例,你换成其他任何语言,都会有瓶颈。最终,你的服务是会落地到机器上的,机器的瓶颈有CPU 内存 磁盘IO 带宽 最大端口数等。大多数情况,高IO操作第一个爆炸的一定是上行带宽。我们取个整,以1024qps为例,假设平均个Response为20KB。那么你所需要购买的带宽就是20MB。有兴趣的朋友大家可以查一下价格,但是我们用阿里云的LBS这个流量走的是内网,是不占用外网上行带宽的。这个的优化空间很小,毕竟那么多请求都需要拿到数据,我们是通过中间件对ETag来做判断,对拿过数据的同学直接做302 Not Modify的(我先立个flag,后续我会单独发文细讲)。

    接下来我们来算一算内存,由于我生产环境的内存很充裕,我直接就给Nginx的buffer设置到了9个128Kb的区块,暂时没有超出buffer落盘的日志。这里假设每个请求最多最多使用1Mb,由于我们Laravel使用的是fpm,所以在我们所在的child进程中请求结束后,所有的内存占用会被清掉不用担心内存泄漏的问题,那满打满算内存使用量到不了2G。(如果你的应用不仅是IO密集型,还是计算密集型,那么你使用的内存也会是个瓶颈)

    接下来就是CPU了,这是我们Laravel的弱项。每个请求我们都会重新加载一次我们的服务容器。但是对于Lumen来说,我们所所需加载的量已经比Laravel要少很多了。我试过在我的机器上(由于性价比和法务的原因,我选择了阿里云聚石塔8核8G),输出几个基本和一般复杂的运算,打满CPU且不报错的情况差不多能ab -c 100 -n 100000达到 1500-4000的量(该优化的都优化了)。这里lumen官网给出了Benchmark 1900的数据,我觉得较为中肯。

    说了这么多,这里的qps也是千把个。那么怎么才能接住1.5亿每天的请求呢?答案就是只做自己擅长做的事。我直接上图吧

    file

    我们所有的并非需要返回值的请求(例如埋点)在nginx就已经通过syslog直接在内存里就送到了阿里云的logtail,返回结果也是把头部都清空了(还需要47b),根本不需要通过PHP的fpm。而真正是要获取到信息的API的请求(最大的一个返回值有670kb),在峰值情况也不到2000qps,且均从本机memcache服务中读取后Format到想要的格式,不经过数据库。

    所以我们的机器配置只有两台8核8G做API(其中一台还兼任流处理),两台4核4G做log收集。平日里负载都在30%左右。

    请多指教

    与君共勉

    Ryan

  • Laravel 有没有轻量的搜索方案? at 6个月前

    OpenSearch可以提供满足你大多数的需求。而且数据源可以选择ODPS或者是RDS

  • 请教,Laravel 多对多查询如何实现? at 6个月前

    两个模型的建立:

    use Illuminate\Database\Eloquent\Model;
    
    class User extends Model
    {
        //
    }
    
    class Department extends Model
    {
        //为了确定连接表表名,Eloquent 会按照字母顺序合并两个关联模型的名称。 当然,您可以自由地覆盖这个约定,通过给 `belongsToMany` 方法指定第二个参数实现
        public function users()
        {
            return $this->belongsToMany(__NAMESPACE__ . '\User', 'department_user', 'department_id', 'user_id');
        }
    }

    可以参考文档
    多对多中文
    英文

    使用方法:

    $department = Department::with('users')->find(1);

    print_r($department->users);

  • 关于 passport code 授权总是报错? at 6个月前

    检查一下请求的client_id字段的值在数据库oauth_clients表中是否存在哦

  • 前端资源过大,app.js 文件达到 1m 多,package 并没有加入多少东西,可就是压缩不下去,这是为什么呢? at 6个月前

    同样的问题,我用的是element-UIvue-router,整个Dashboard项目app.js npm run production后有 1Mb 多一点左右,还没有研究怎么拆分。
    我还没有把vendor.js拆出来,虽然只有1个文件,且只加载一次,平时都是302缓存住的,且都是自己公司的运营在用,但是我还是觉得一次性下载的文件太大了,影响第一次的打开的效率。

  • 可以尝试删了你的代码,也许你会有不一样的感觉 at 6个月前

    弱弱得问一句@Summer

    我已经参与翻译了几段翻译模块里的文章了。觉得这里的文章都很不错,但是它们完成之后会被隐藏或移除吗?真的不想看到它们从这里消失。

    此外,有个小建议
    我希望能够在这个模块中的已经翻译完的作品中,可以看到英文原文全文或者对照的功能。满足我喜欢看英文文档的小偏好。