我们正在运行一个用 Laravel 编码的基于 MySQL/PHP 的网络应用程序。基本上,我们用它来管理电脑维修店的服务工作/工作单。我们那里有近 2500 个工单,有时运行速度有点慢,尤其是当多个技术人员输入或更新工单时。使它更快、更有效地工作的最佳方法是什么,尤其是当我们继续增加客户和工作订单时。服务器在 Linux Software RAID1 中运行 CentOS 6 x64、cPanel、Intel Xeon E3、2x Enterprise SATA。 谢谢!
最佳答案
不确定一个答案在指定解决方案时能深入到什么程度,但有许多最佳实践可供遵循。我认为这就是您所追求的,因为您没有指定任何特定的瓶颈。
一些快速提示是
- 缓存您的查询:
因此,如果在您的应用程序上运行查询,其数据仅每 x 天更新一次,为什么不将其缓存 x 天,以便您的数据库避免在两者之间被不必要地击中?来自 docs 的示例:
$value = Cache::remember('users', $minutes, function()
{
return DB::table('users')->get();
});
- 利用队列:
当用户更新工作订单(电子邮件、调用其他逻辑)时,后台任务可能正在运行,这可能需要一些时间并导致用户不得不等待。与其让这些任务在那一刻运行并降低用户的速度,不如将它们排队等待稍后运行。 Laravel supports许多不同的队列驱动程序用于此目的。我个人用过Beanstalk但你可以尝试类似 IronMQ 的东西
Beanstalk 的基本用法:更改/app/config/queue.php 以指定您的默认队列驱动程序和任何配置,包括队列名称:
'default' => 'beanstalkd',
'beanstalkd' => array(
'driver' => 'beanstalkd',
'host' => 'localhost',
'queue' => array('default','SendEmail'),
),
然后,在您的 Controller 中,您可以执行以下操作以推送到该队列:
Queue::push('SendEmail', array('message' => 'Something...'));
仅供引用,Fideloper 拥有出色的 tutorial对此。
- 警惕 n+1 问题并使用预先加载:
docs解释这个问题。
- 考虑切换到 NoSql 数据库,如 MongoDB(完全取决于要求):
正如我提到的,这完全取决于您的应用程序和您正在做的事情,但在某些情况下,在 MySQL 上使用 NoSql 数据库有其优点。您可以利用分片和复制来帮助使用 MongoDB 扩展您的应用程序,但当然不仅限于 mongo。
您还可以做很多其他事情,但仅凭上述提示,我认为您可以使您的应用更快、更高效。
关于mysql - Laravel Web 应用程序的可扩展性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23448715/