我正尝试从数据中心托管服务器上迁移使用CodeIgniter构建的应用程序以在Azure Web App服务上运行。我不得不解决了几个问题,但这一个让我们陷入困境。 。 。php chmod不能在Azure Web App上新创建的文件上工作
使用CodeIgniter,CI_Log类构造方法在system/core/common.php文件中调用名为is_really_writable的函数,以确保日志目录是可写的。此函数在给定文件夹中创建一个文件,然后尝试对文件执行chmod以设置权限,然后删除它。如果它能够完成这些操作,它假定它可以写入目录。
我得到我的日志文件中出现以下错误时,这就是所谓的:
错误 - 2016年11月2日12时19分42秒 - >严重性:警告 - >搭配chmod():没有这样的文件或目录D:\ home \ site \ wwwroot \ system \ core \ Common.php 92
错误 - 2016-11-02 12:19:42 - >严重程度:警告 - > unlink(application /日志/ 1f3202d820180a39f736f20fce790de8):没有这样的文件或目录d:\家\网站\ wwwroot的\ SYSTEM \核心\的common.php 93
的在我的日志文件夹中有我的正常日志文件,以及上面的“1f3202d820180a39f736f20fce790de8”等大量垃圾文件。看起来这个函数有时必须返回true,因为它写了一个日志文件(如果函数返回false,它不会这样做)。
我唯一的想法是: - 这可能与Azure权限有关。我觉得这是不太可能的,因为它必须成功至少几次,因为日志正在创建和写入。 - 也许服务器真的很慢,并且在尝试chmod然后取消链接之前未创建文件。我觉得这是不太可能的,因为我认为fopen函数在文件创建之前不会返回。
如果我无法得到这个工作,我在我的智慧结尾,并准备放弃尝试使用Azure Web App服务。有任何想法吗?
供参考,在这里是有问题的函数的代码:
function is_really_writable($file)
{
// If we're on a Unix server with safe_mode off we call is_writable
if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") != TRUE)
{
return is_writable($file);
}
// For windows servers and safe_mode "on" installations we'll actually
// write a file then read it. Bah...
if (is_dir($file))
{
$file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100));
if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
{
return FALSE;
}
fclose($fp);
@chmod($file, DIR_WRITE_MODE);
@unlink($file);
return TRUE;
}
elseif (! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
{
return FALSE;
}
fclose($fp);
return TRUE;
}
这里是日志类的构造方法被调用它:
public function __construct()
{
$config =& get_config();
$this->_log_path = ($config['log_path'] != '') ? $config['log_path'] : APPPATH.'logs/';
if (! is_dir($this->_log_path) OR ! is_really_writable($this->_log_path))
{
$this->_enabled = FALSE;
}
if (is_numeric($config['log_threshold']))
{
$this->_threshold = $config['log_threshold'];
}
if ($config['log_date_format'] != '')
{
$this->_date_fmt = $config['log_date_format'];
}
}
每gary-liu-msft建议,我已经做了一些更多的工作来将此隔离为CodeIgniter的一个问题,并且我100%确定它只是我们此时使用的CodeIgniter的版本。我创建了一个具有相同功能的脚本,并且它运行了数千次而不会遇到相同的行为。我会尝试首先更新到CodeIgniter 2的最新版本,如果这样做不起作用,我们将不得不尝试最新的版本3.一旦我有解决问题的任何其他人的解决方案,我将更新。
我还应该提到,这个应用程序非常慢(加载页面需要25秒,在我们当前的生产Windows服务器上需要6秒钟,是的,我知道这很糟糕,但我使用了最长的加载页面之一作为比较测试环境)。我还没有确定这种差异是否归因于我们迁移到Azure SQL或PHP的数据库,但是我有一种感觉,无论是什么导致这种迟缓可能会导致我的上述问题。 – OneSimpleGeek
您在场景中使用哪种CI版本?您是否有任何自定义配置,或者您只是在Azure Web Apps上部署CI应用程序? –
我们在2.1.4上,在我们的应用程序中没有对核心CodeIgniter类的自定义配置。 – OneSimpleGeek