2016-11-02 6 views
0

Azure Web Appサービスで実行するために、CodeIgniterで構築されたアプリケーションをデータセンターのホストサーバーから移行しようとしています。私はすでにいくつかの問題を解決しなければなりませんでしたが、これは私たちに悩まされています。 。 。Azure Web Appで新しく作成されたファイルでphp chmodが動作しない

CodeIgniterの場合、CI_Logクラスのコンストラクトメソッドは、system/core/common.phpファイルのis_really_writableという関数を呼び出して、ログディレクトリが書き込み可能であることを確認します。この関数は、指定されたフォルダにファイルを作成し、そのファイルに対してchmodを実行してアクセス権を設定しようとします。これらのアクションを完了することができれば、ディレクトリに書き込むことができるとみなされます。

これが呼び出されたとき、私は私のログファイルに次のエラーを取得しています:

ERROR - 2016年11月2日午前12時19分42秒 - >重要度:警告 - >のchmod():このようなファイルやディレクトリはありません。D:\ home \ site \ wwwroot \ system \ core \ Common.php 92

エラー - > 2016-11-02 12:19:42 - >重大度:警告 - >リンク解除/ログ/ 1f3202d820180a39f736f20fce790de8):そのようなファイルまたはディレクトリD:ホーム\サイト\ wwwrootに\を\システム\コア\ common.phpが93

n私のログフォルダには私の通常のログファイルがあり、上記の "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; 
} 

そして、ここでそれを呼び出しているログクラスの構造方法である:gary-liu-msft提案パー

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']; 
    } 
} 

、私はこれをCodeIgniterの問題として単離するための作業をいくつか行いましたが、私たちがこの時点で使用しているCodeIgniterのバージョンであることを100%確信しています。私は同じ機能を持つスクリプトを作成し、同じ動作を経験することなく何千もの時間を実行しました。私はCodeIgniter 2の最新バージョンに最初に更新してみてください。それが機能しない場合は、最新のバージョン3を試してみる必要があります。この問題になる他の人のために解決したら更新します。

+0

このアプリケーションは非常に遅い(私たちの現在の実稼働Windowsサーバーでは6秒かかっているページを読み込むのに25秒かかりますが、私はそれが悪いと知っていますが、最長の読み込みページの1つを環境)。違いがAzure SQLまたはPHPに移行したデータベースによるものかどうかをまだ特定していませんが、この低迷を引き起こしている原因が何であれ、上記の問題に寄与している可能性があります。 – OneSimpleGeek

+0

シナリオで使用しているCIバージョンはどれですか?カスタム設定がありますか、単にAzure Web AppsにCIアプリケーションを配備していますか? –

+0

私たちは2.1.4を使用しており、アプリケーションのコアCodeIgniterクラスに対するカスタム設定はありません。 – OneSimpleGeek

答えて

0

chmodは、WindowsではなくLinuxの構成です。そして、あなたがApp ServicesのLinuxプレビューを使用していない限り、あなたのウェブアプリケーションはWindowsの上に座っており、chmodを動かすことはできません。

あなたのアプリのwwwrootの下では、あなたのアプリは完全な書き込み権限を持っています。

+0

これはWindowsサーバー上でうまく動作し、ログファイルが作成されているので、少なくとも2,3回真実を返すようです。また、chmodはAzure Web App環境でサポートされている関数です。 Kudu環境のコマンドプロンプトから使用できます。 – OneSimpleGeek

関連する問題