Home >Backend Development >PHP Tutorial >做定时任务时,怎么解决服务器内存不够用啊?

做定时任务时,怎么解决服务器内存不够用啊?

WBOY
WBOYOriginal
2016-06-06 20:10:061510browse

<code> 
 ignore_user_abort(true);
 set_time_limit(0);
 
 $b = str_repeat(' ', 10000);
 
 $i = 0;
 
 ob_start();
 while (true) {
     sleep(1);
     file_put_contents('sf.txt', date('Y-m-d H:i:s') . $i . "\r\n", FILE_APPEND);
 
     echo $i,$b,'<br>';
     ob_flush();
     flush();
 }
 </code>
<code>
没想到几秒钟 Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 133437441 bytes) in /data/home/hyu1658240001/htdocs/a.php on line 16 就这样了 啊啊啊啊

我只是想做一个定时任务,不断的检测超时支付的订单,以实现自动关闭超时订单,为什么不行啊???

在线等大神指点啊,时间限制我已经取消了,是不是有个配置内存不受限制的啊?

</code>

回复内容:

<code> 
 ignore_user_abort(true);
 set_time_limit(0);
 
 $b = str_repeat(' ', 10000);
 
 $i = 0;
 
 ob_start();
 while (true) {
     sleep(1);
     file_put_contents('sf.txt', date('Y-m-d H:i:s') . $i . "\r\n", FILE_APPEND);
 
     echo $i,$b,'<br>';
     ob_flush();
     flush();
 }
 </code>
<code>
没想到几秒钟 Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 133437441 bytes) in /data/home/hyu1658240001/htdocs/a.php on line 16 就这样了 啊啊啊啊

我只是想做一个定时任务,不断的检测超时支付的订单,以实现自动关闭超时订单,为什么不行啊???

在线等大神指点啊,时间限制我已经取消了,是不是有个配置内存不受限制的啊?

</code>

你没确定脚本有问题?

单独跑脚本确定没问题?

先确定脚本的问题吧。

报错误不一定是内存不够用,可能是你逻辑问题,给你多少内存都会崩。

你这是死循环 改其他方案

file_put_contents函数是一直占用内存的

用linux的定时任务去执行php脚本

使用sleep(2),将程序休息几秒钟

我用的oracle job 存储过程,只不过频率低. 或者在使用订单时条件触发.毕竟只有使用时才需要考虑是否有效

用nodejs来跑

了解到你的目的是:能够自动关闭超时未支付的订单

可以试着换个思路来解决:
把定时任务改为: 每次用户点击订单相关页面时,检测下是否有超时未支付的订单。如果有,则将它们关闭。

crontab

拆分放到任务队列执行

1.你需要把程序改成php-cli方式运行,即试用php命令来执行。例如:/usr/local/php/bin/php index.php
2.把脚本里面while循环更改掉,试用crontab来执行该脚本,当php脚本执行完后,整个php脚本的运行内存就被回收就不会出现内存溢出的问题了。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn