是否有一个设置可以让我在 PHP 启动后自动加载/执行一些脚本,比如将一些常量放入全局内存中。
还有一个可以跨用户访问的全局内存吗?另外关于内存,是否没有所有用户都可以访问的内存?一个人设置另一个人访问它,或者我是否应该每次都必须读写文件才能共享某些东西,或者更确切地说是数据库临时表。
惊讶的 PHP 没有这个?
谢谢。
PHP 不提供跨脚本共享的全局缓存。您可以根据您的要求以不同的方式解决此问题。
如果您想设置计算成本不高的全局常量,您可以编写一个定义这些常量的脚本,然后自动让该脚本在请求的文件之前运行。这是使用 php.ini 中的auto_prepend_file 选项完成的。
如果您正在计算昂贵的值,您可以使用memcached作为所有 PHP 脚本都可以访问的全局缓存。有多个客户端 API可以使用 PHP 连接到 memcached。
当然,如果这些值是每个用户的,您也可以在用户会话中存储全局值。甚至使用 MySQL。
如果我理解正确,您希望 PHP 在启动 Apache 时执行一些脚本,以存储一些全局共享值。如果我错了,请编辑/评论。
简短的回答是:不,你不能那样做。PHP 并不完全是一个等待客户端请求保持运行的服务器。它单独处理每个 HTTP 请求。
长答案是:嗯......你可以在每个请求上执行 auto_prepend_file 。您可以创建一些简单的 bash 脚本并使用它来启动 Apache,然后调用 PHP 脚本,但它不会在 Apache 中执行。
至于共享内存,有几种选择。使用平面文件、数据库或 memcached 可能是最可移植的。某些安装启用了共享内存功能,但不能保证。
如果您使用某种 MVC 框架,您可以在那里定义变量并确保每次都加载该文件。您可以使用 $GLOBALS['var_name'] = $value; 并在该请求期间在其他文件中访问它。
每个正在运行的 PHP 脚本实例都有自己的全局变量、函数、常量等,无法将变量从一个正在运行的脚本实例直接复制到另一个。但是,也有一些间接方法,例如使用文件、数据库或 memcached。
如果您使用某些子系统(如 APC 共享内存,甚至 memcached),您可以通过编辑它的启动脚本 ( /etc/init.d/[apache2|httpd]
) 在 apache 启动时自动运行数据生成器脚本。例如,您可以在 start|restart 后立即将 curl 或 wget 请求添加到生成器脚本。
在第一个“外部”请求中存在未初始化状态的可能性很小,但我相信您可以处理。