PHP适用于非常大的项目吗?它可以交易安全吗?

PHP适用于非常大的项目吗?它可以交易安全吗?

问题描述:

这个问题可能会显得很奇怪。PHP适用于非常大的项目吗?它可以交易安全吗?

但每次我在过去做PHP项目的时候,我遇到过这种不愉快的经历:

脚本取消10秒后运行。这会导致非常糟糕的数据库不一致(删除循环的错误示例:用户即将删除相册。相册对象将从数据库中删除,然后在删除照片时脚本被杀死的位置向下一半,并且10.000张照片没有参考)。

这不是交易安全的。我从来没有找到一种方法来安全地,以确保它的完成。如果脚本被杀死,它会被杀死。正好在循环中。它刚刚死亡。这从来没有发生在用java的tomcat上。 Java运行并运行并运行,如果需要很长时间的话。

Lot的时事通讯脚本试图通过将作业分成许多包,即每次发送100个包,然后关闭页面(哦,真的很愚蠢),做下一个包,等等。大多数情况下挂起或脚本将花费超过10秒钟,并且您的平台被瘫痪。

但是后来,我听说很大的项目使用PHP,如studivz(德国Facebook克隆,实际上是最大的德国网站)。所以有一点希望:这种不良行为只是来自非专业的托管公司,因为他们的服务器非常糟糕,他们只是杀了php脚本。这是什么道理?它可以这样配置,脚本永远不会被杀死,因为它们需要更长的时间?

+5

Facebook足够大吗? :) – 2009-06-01 12:08:00

+0

当然,您可以定义在PHP中脚本执行需要多长时间。在你自己的服务器上,就像向php.ini文件中添加一个新值一样简单。使用简单的虚拟主机解决方案,您几乎没有机会做到这一点。 – okoman 2009-06-01 12:13:22

+0

set_time_limit(0);我一直都在这个世界上。 – xenon 2009-06-01 20:12:38

您是否在寻找set_time_limit()ignore_user_abort()

+0

ignore_user_abort不计算脚本的最大执行时间 – Kazar 2009-06-01 12:10:09

您可以配置多少时间允许执行脚本,无论是在php.ini中或通过函数ini_set /的set_time_limit

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

很多大网站都在PHP writen:脸谱,维基百科,StudiVZ的,Digg.com等很多你谈论的东西只是配置的东西,也许你应该看看?

而不是studivz(德国Facebook克隆),你可以看看完全是PHP的Facebook。或Digg。或许多雅虎网站。或许多其他许多人。

ignore_user_abort可能是您要查找的内容,但您也可以根据计划维护作业添加另一个图层。他们基本上运行在指定的时间间隔,并做各种事情,以确保您的数据/文件系统处于您想要的状态...删除旧/未链接的文件只是许多事情中的一个。

PHP适用于非常大的项目吗?

每当我看到这样的问题,我都有点不安。 非常大是什么意思?对你来说可能很大,对我来说可能很小,反之亦然。这甚至假设我们使用相同的指标。你是在测量建造项目的时间,完成项目的生命周期,涉及的资金,使用它的人数,开发人员的建造/维护数量等。

那就是说,问题你描述的声音就像你不知道你的技术够好。无论您选择哪种技术,这对您都是一个问题。例如,使用数据库事务来确保原子性。并使用异步脱机作业来处理长时间运行的任务(如调度邮件列表)。

如果您需要做的交易在PHP中,你可以这样做:

mysql_query("BEGIN"); 

/// do your queries here 

mysql_query("COMMIT"); 

的commit命令将刚刚完成交易。

如果出现任何错误,你可以使用回滚:

mysql_query("ROLLBACK"); 

编辑:注意这只会工作,如果你使用的是支持的交易,例如InnoDB

性能数据库而不是您在完成大部分网站后可以投入的功能。 你必须设计重载的网站。

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

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

许多软件站点都是用PHP制作的。但是,您将不会听到数百万用PHP制作的网页,因为这些网页已被放弃而不再存在。这些页面可能已经烧毁了所有公司的钱来处理PHP混乱,或者他们破产,因为他们的软件太糟糕了,客户不想要它...... PHP似乎在初创公司很好,但它不能很好地扩展。是的,PHP中有许多庞大的网站,但它们都是例外情况,而非常规。

对于像删除相册或发送1000封电子邮件这些大循环,您可以寻找ignore_user_abort和set_time_limit。
事情是这样的:

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定时器和限制通常是一种停止解决方案,如果使用Web来启动脚本,您仍然依赖于客户端浏览器。

如果我有一个需要由浏览器启动的漫长进程,我将浏览器和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。