我在我的应用程序中使用Laravel。它必须计算大型数据集的值。我使用artisan tinker
来测试东西,并从命令行启动此类计算。当我调用控制器方法app()->call('App\Http\Controllers\Calculation@testCalc');
时,计算工作正常,只要我减少从数据库检索的数据集。一旦我大致超过460,计算需要000个数据集(从MySql数据库中检索),执行过程在大约100秒后突然停止。我只是“引导”回shell命令提示符,没有任何错误消息。当在Psy Shell I echo init_get('max_execution_time');
中时,它返回0
。如果它是相关的,应用程序正在具有4GB RAM的虚拟机上运行。env文件被设置为debug
且APP_DEBUG
为真。
以下是输出示例:
user@dev-droplet:/# cd /var/www/html && php artisan tinker
Psy Shell v0.11.9 (PHP 8.0.25 — cli) by Justin Hileman
> app()->version()
= "8.83.26"
> echo ini_get('max_execution_time');
0⏎
> app()->call('App\Http\Controllers\Calculation@testCalc');
Memory Usage: 27236944
Objects fetched: 2400
Memory Usage: 39109520
Number of records retrieved for calculations: 464885
Memory Usage: 1760413384
= null
> app()->call('App\Http\Controllers\Calculation@testCalc');
Memory Usage: 40196720
Objects fetched: 2400
Memory Usage: 49526048
user@dev-droplet:/var/www/html#
对于内存使用语句,我只是使用echo "Memory Usage: ".memory_get_usage()."\n";
。如何才能找出问题所在?感谢您的提示。
1条答案
按热度按时间dsekswqp1#
不看算法很难判断,但这可能是因为你同时检索所有的对象,并使进程允许的RAM过载。你应该考虑使用Laravel的懒惰集合,通过分块你的数据集。例如,如果你有200k个对象,你按500分块它们,你的PHP处理将运行400次,但无论什么时候,只有500个对象会存储在RAM中(除非您有任何内存泄漏)。