我已将 tmp 目录指定为/tmp
(位于 Drupal 管理路径)。通过从admin/config/media/file-system
运行可确认此设置。dpm(file_directory_temp());
devel/php
权限/tmp/drupal_debug.txt
(包括SELinux设置,我了解到这里) 就像这样:
$ ls -ltZ /tmp/
-rwxrwxrwx. apache apache unconfined_u:object_r:httpd_sys_rw_content_t:s0 drupal_debug.txt
此外,如果我dd("Foo")
从 PHP CLI 工具中运行phpsh
使用drush 集成获得引导式 Drupal 环境,然后我就可以dd()
毫无问题地打印到此文件。我是否需要执行其他操作才能允许 Apache 写入此文件?
Apache 日志中没有错误,值得注意的是,即使我运行,问题仍然存在sudo setenforce 0
。
另一个有趣的点:来自这个 StackOverflow 问题当我从 运行它时,它返回“成功” devel/php
,换句话说,Drupal 确实认为它可以写入 中的任意文件/tmp
。但是,如果我将代码修改为以下形式:
$handle = fopen("/tmp/drupal_debug.txt", "x");
if ($handle) echo "Success!";
else print_r(error_get_last());
然后我收到此警告,并且没有成功消息:
警告:fopen(/tmp/drupal_debug.txt):无法打开流:文件存在于eval()(/srv/www/decipher-storyscope/public_html/decipher/7f/profiles/storyscope/modules/contrib/devel/devel.module(1285) 的第 1 行:eval() 的代码)。
即使我删除文件/tmp/drupal_debug.txt
。
但是,正如评论中所讨论的那样,在 Web 上运行此代码片段时不会创建任何文件,而会创建一个空文件是如果我从 PHP 命令行运行相同的代码片段,就会创建。
注意:当代码dd()
在 Ubuntu 上安装并调用时,该函数运行正常。
答案1
我从系统管理员那里得到建议:将tmp
目录放入/srv/www
。
shell> sudo mkdir /srv/www/my-project/tmp
shell> sudo chmod a+w /srv/www/my-project/tmp
在 Drupal 中settings.php
:
$conf['file_temporary_path'] = '/srv/www/my-project/tmp';
然后:tail -f /srv/www/my-project/tmp/drupal_debug.txt
工作了。