PHP Exec() 和 Python 脚本可扩展性问题

4
我有一个 PHP 应用程序,它通过 exec() 和 cgi 执行 Python 脚本。
我有许多页面都在执行这个操作,虽然我知道 WSGI 是更好的长期解决方案,但我想知道对于中小流量来说,这种方式是否可行。
我问这个问题是因为有些帖子提到 Apache 必须为每个 Python 解释器实例生成一个新进程,这会增加开销,但我不知道对于一个较小的项目来说这有多重要。
谢谢。

个人而言,如果你要处理多个并发用户,我不会建议这么做。你的程序很容易积累大量孤立进程,而且你的脚本还可能完全锁住 Python 并停止响应。 - Alex
对于“小”流量,虽然这种方法很粗糙,但不应该有问题。对于“中等”流量,我不会这样做。除了锁定问题外,您还需要考虑“慢进程”问题、机器人等问题——重新加载或流量峰值会使您的计算机超载。现在在金字塔/瓶子等中运行Python脚本的WSGI非常简单。对于小流量,您可能可以使用crontab来处理任务,通过队列和数据库或文件系统中的dropbox来完成任务。 - Jonathan Vanasco
谢谢Jonathan。如果我想使用WSGI,您会推荐安装mod_wsgi(我使用apache作为PHP)和Web框架(如CherryPy)吗?然后,不使用exec(),而是使用其他PHP函数来执行脚本? - user1170192
1个回答

0

在CGI的情况下,每次收到请求时,服务器都会启动一个PHP解释器的副本。PHP然后启动Python进程,在exec()之后被终止。每次请求都要启动两个进程并进行所有导入,这会产生巨大的开销。

在FastCGI或WSGI的情况下,服务器保持几个进程处于运行状态(最小和最大运行进程数量可配置),因此以一些内存为代价,您可以摆脱每次启动新进程的问题。但是,您仍然需要在每次exec()调用时启动/停止Python进程。如果您可以在不使用exec()的情况下使用Python应用程序,例如将PHP部分移植到Python,则可以大大提高性能。

但正如您所提到的,这是一个小项目,因此唯一重要的标准是您当前的服务器是否能够承受当前负载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接