题
这个问题可能出现奇怪的。
但每次我在过去做PHP项目的时候,我遇到过这种不愉快的经历:
脚本取消10秒后运行。这会导致非常糟糕的数据库不一致(坏榜样为删除循环:用户将要删除的相册相册对象会从数据库中删除,然后再半路上删除脚本得到正确打死它在哪里的照片下来,。 10.000照片留下没有参考)。
这不是交易安全。我从来没有找到一种方法,做一些事情的安全的,以保证它的的完成的。如果脚本就会被杀死,它就会被杀死。就在一个循环的中间。它被刚杀了。这从来没有发生在用java tomcat的。的Java运行,并运行,并运行时,如果花费很长。
通讯 - 脚本的地块我们尝试通过拆分工作成很多包,即一次发送100,然后relading页面(哦,天哪,真是愚蠢),做下一个来左右这个问题,并等等。最常见的东西挂起或脚本将需要更长的时间超过10秒,你的平台是残缺的。
但后来,我听到非常大的项目中使用PHP像学为(德国Facebook的克隆,实际上是德国最大的网站)。因此,有希望的一个微小的光,这种不良行为只是来自非专业的托管公司谁杀了PHP脚本,因为他们的服务器是如此糟糕。什么是这个道理?它可以以这样的方式进行配置,即脚本从来没有被打死,因为他们需要更长的时间?
没有正确的解决方案
其他提示
时PHP适合非常大的项目?
每当我看到这样的问题,我有点不安。这是什么的非常大的意思吗?什么可以大到你,可能是小我,反之亦然。那就是即使假设我们用同样的指标。你测量的时间来构建项目,项目,资金所涉及的整个生命周期,使用它的人数量,开发者构建数字/维护它,等等等等。
这是说,你所描述的一样,你的声音不知道你的技术足够好问题。这将是对你的一个问题,无论你选择哪种技术的。例如,使用数据库事务,以确保原子。使用异步离线作业要处理长时间运行的任务(如调度邮件列表)。
如果不良行为是覆盖在如Zend框架良好的框架了很多。 凡是需要更长的时间在10秒真的搞砸了,但你总是可以提高的执行时间与的http:// DE3。 php.net/set_time_limit
这是很多大网站都在PHP writen:脸谱,维基百科,StudiVZ的,Digg.com等很多你所谈论的事情是配置的东西,也许你应该考虑的是
?性能是不是一个功能,你可以扔在大部分的网站完成后。 你必须设计的网站沉重的负担。
如果数据库的任务通常涉及10K行,你应该准备不只是执行时间的问题,但其他维修问题。
- 最坏的情况:使一个一致性工具检查和修复这些错误。
- 更好。而不是phisically删除的影像,只是旗他们,让后台服务采取昂贵的演习照顾
- 最佳:你可以利用作业队列服务,该作业添加到队列
如果您需要做的交易在PHP中,你可以这样做:
mysql_query("BEGIN");
/// do your queries here
mysql_query("COMMIT");
在commit命令将刚刚完成交易。
如果发生任何错误,你可以使用回滚:
mysql_query("ROLLBACK");
编辑:注意,如果你使用的是支持的交易,例如InnoDB数据库,这只会工作,
可以配置多少时间被允许用于执行脚本,或者在php.ini设置或通过的ini_set /参数或者set_time_limit
除了学为(德国Facebook的克隆)的,你可以看看实际的Facebook这完全是PHP。或Digg的。或许多雅虎的网站。或者很多很多的人。
ignore_user_abort可能是你在找什么,但你也可以在定期维护工作方面再添层。他们基本上是在指定的时间间隔运行,并做各种事情,以确保您的数据/文件系统是在你想...删除旧/断开链接文件的状态只是许多事情可以做的。
有关这些大循环,如删除相册或发送你想找的ignore_user_abort和的set_time_limit电子邮件的1000年。结果 是这样的:
ignore_user_abort(true); //users leaves webpage will not kill script
set_time_limit(0); //script can take as long as it wants
for(i=0;i<10000;i++)
costly_very_important_operation();
然而小心,这可能潜在地运行脚本永远:
ignore_user_abort(true); //users leaves webpage will not kill script
set_time_limit(0); //script can take as long as it wants
while(true)
do_something();
该脚本永远不会死,除非你重新启动服务器。
因此最好是从来没有设置的时限的0。
在技术上没有任何编程语言是交易安全,这是一个需要交易安全数据库。因此,如果脚本/代码运行的死亡或者断开连接,无论出于何种原因,该交易将被回滚。
在一个循环中把查询是一个好主意,除非它被专门设计为在分批运行和断裂更大的一组成较小的块。调整PHP定时器和限制通常的止动间隙解决方案,则仍然依赖客户端浏览器上,如果使用网络开球的脚本。
如果我有一个长期的过程,需要由一个浏览器,I“断开”从浏览器和web服务器,以便同时在脚本运行控制返回给用户的过程中拉开序幕。在命令行运行PHP脚本可以几个小时,如果你想运行。然后,您可以使用AJAX,或重新载入页面,以检查长时间运行的脚本的进度。
有与此代码的安全问题,但为“断开”从PHP下的东西像Apache运行的进程:
exec("nohup /usr/bin/php -f /path/to/script.php > /dev/null 2>&1 &");
但是,真的没有任何做PHP适合于大型项目或正在交易的安全。 PHP可以用于大型项目,但由于默认情况下没有代码,仍然命中之间的“居民”,它可以变得缓慢,如果没有设计权。此外,由于没有命名空间的支持,你想如果你有一个大的开发团队未雨绸缪。
这是罚款基于Java系统需要几分钟的时间来启动,初始化并加载所有默认的对象。但是,这是用PHP不可接受的。 PHP将需要更多的规划更大的系统。现在的问题是,什么时候保存在使用PHP时得到由一个大型系统所需的额外计划时间浪费呢?
您最有可能经历了过去糟糕的数据库的一致性的原因是因为你使用MySQL的MyISAM引擎(不支持事务)。使用InnoDB相反,它支持交易和执行行级锁。 或使用PostgreSQL。
许多,许多软件的网站在PHP做。但是,你不会听到数百万PHP做的网页,因为他们放弃了这个不存在了的。这些页面可能已经烧毁所有公司的钱用于处理PHP混乱,或者他们破产,因为他们的软是如此糟糕的客户不希望它... PHP似乎不错,在启动,但它没有很好地进行缩放。是的,有在PHP中做出了许多巨大的网站,但他们都比较例外,不是一种常态。