这个问题可能看起来很奇怪。

但以前每次做PHP项目时,我都会遇到这样不好的经历:

脚本在 10 秒后取消运行。这会导致非常严重的数据库不一致(删除循环的坏例子:用户即将删除相册。相册对象从数据库中删除,然后删除照片的一半,脚本就在原地被杀死,10.000 张照片没有参考)。

它不是交易安全的。我从来没有找到一种方法来做某事 安全地, ,以确保它是 完毕. 。如果脚本被杀死,它就会被杀死。就在循环的中间。它就这样被杀死了。在带有 java 的 tomcat 上从来没有发生过这种情况。Java 运行、运行、运行,如果需要很长时间的话。

许多新闻通讯脚本试图通过将作业分成许多包来解决这个问题,即一次发送 100 个,然后重新加载页面(天哪,真是愚蠢),执行下一个,依此类推。大多数情况下,某些东西会挂起或脚本将花费超过 10 秒的时间,并且您的平台会瘫痪。

但是后来,我听说非常大的项目使用 PHP,比如 Studivz(德国 Facebook 克隆,实际上是最大的德国网站)。因此,有一点希望,这种不良行为只是来自不专业的托管公司,他们只是杀死 php 脚本,因为他们的服务器太糟糕了。这件事的真相是什么?是否可以以这样的方式配置,使脚本永远不会因为花费更长的时间而被杀死?

没有正确的解决方案

其他提示

  

时PHP适合非常大的项目?

每当我看到这样的问题,我有点不安。这是什么的非常大的意思吗?什么可以大到你,可能是小我,反之亦然。那就是即使假设我们用同样的指标。你测量的时间来构建项目,项目,资金所涉及的整个生命周期,使用它的人数量,开发者构建数字/维护它,等等等等。

这是说,你所描述的一样,你的声音不知道你的技术足够好问题。这将是对你的一个问题,无论你选择哪种技术的。例如,使用数据库事务,以确保原子。使用异步离线作业要处理长时间运行的任务(如调度邮件列表)。

如果不良行为是覆盖在如Zend框架良好的框架了很多。 凡是需要更长的时间在10秒真的搞砸了,但你总是可以提高的执行时间与的http:// DE3。 php.net/set_time_limit

这是很多大网站都在PHP writen:脸谱,维基百科,StudiVZ的,Digg.com等很多你所谈论的事情是配置的东西,也许你应该考虑的是

性能不是您可以在网站的大部分内容完成后添加的功能。您必须设计适合重负载的站点。

如果数据库任务通常涉及 10K 行,那么您不仅应该准备执行时间问题,还应该准备其他维护问题。

  • 最坏的情况下:制作一个一致性工具来检查并修复这些错误。
  • 更好的:无需物理删除图像,只需标记它们并让后台服务来处理昂贵的操作。
  • 最好的:您可以利用作业队列服务并将该作业添加到队列中。

如果您需要做的交易在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中做出了许多巨大的网站,但他们都比较例外,不是一种常态。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top