2016-11-02 23 views
0

我正尝试从数据中心托管服务器上迁移使用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.一旦我有解决问题的任何其他人的解决方案,我将更新。

+0

我还应该提到,这个应用程序非常慢(加载页面需要25秒,在我们当前的生产Windows服务器上需要6秒钟,是的,我知道这很糟糕,但我使用了最长的加载页面之一作为比较测试环境)。我还没有确定这种差异是否归因于我们迁移到Azure SQL或PHP的数据库,但是我有一种感觉,无论是什么导致这种迟缓可能会导致我的上述问题。 – OneSimpleGeek

+0

您在场景中使用哪种CI版本?您是否有任何自定义配置,或者您只是在Azure Web Apps上部署CI应用程序? –

+0

我们在2.1.4上,在我们的应用程序中没有对核心CodeIgniter类的自定义配置。 – OneSimpleGeek

回答

0

chmod是一个Linux结构,而不是Windows。除非你使用应用程序服务的Linux预览版,否则你的网络应用程序就在Windows上,并且不会让你运行chmod

在您的应用程序的wwwroot下,无论如何,您的应用程序都拥有完整的写入权限。

+0

现在,这在Windows服务器上正常工作,正如我所提到的,由于日志文件正在创建,似乎至少返回true。另外,chmod是Azure Web App环境上支持的功能。您可以在Kudu环境中的命令提示符下使用它。 – OneSimpleGeek