2016-04-10 15 views
1

realpath呼び出しのすべてをrealpath_fixed呼び出しと置き換えるにはどうすればよいですか?PHPソースコード内の関数呼び出しを安全に置き換える

私は'#realpath(\s*)\((.+)\)#'で終わったが、これはいつもうまくいくかどうかわからない。

EDIT:私の制御下にないソースコードを編集することはできません。これは、PHARアーカイブをビルドする際にPHPスクリプトで行う必要があります。

<?php 

foreach (glob(__DIR__.'/test/*.php') as $pathname) { 
    $contents = preg_replace(
     '#realpath(\s*)\((.+)\)#', 
     'realpath_fixed$1($2)', 
     file_get_contents($pathname) 
    ); 
} 
+0

適切なエディタを使用してください。 – RiggsFolly

+0

手順1)このような機能を持つエディタを使用します。2)置き換えます。3)置き換え後にテストを実行します。5)問題を修正します。 –

+0

@RiggsFolly残念ながら、pharアーカイブ内のすべてのソースファイルをパックする前に、PHPスクリプトでこれを行う必要があります。 – gremo

答えて

0

これは、Pharアーカイブ内のすべてのソースファイルを梱包する前にPHPスクリプトで行うべきです。

これは間違っています。何らかの理由で代替メソッドが必要な場合は、realpath()の代わりにすべてのソースでmyrealpath()を使用します。そして、あなたが解放しようとしているときにrealpathの動作が異なる必要がある場合は、myrealpath()を実装してpharを実行するファイルを1つだけ交換してください。それでおしまい。もちろん

EDIT

しかし、私は、サードパーティのコード内のrealpathを置き換えることはできません。

スレータの変更点です。スクリプトを実行する環境を制御する場合は、APD extensionrename_function()またはrunkitとそのrunkit_function_redefine())を使用することを検討してください。

もしそうでない場合は、realpath()がサードパーティのライブラリにどれくらいあるかチェックします。それほど多くなくてもそれを頻繁に変更しなければ、おそらく私のmyrealpath()を代わりに使うために、これらのlibsのパッチをつけたものを作るつもりです。グローバルな自動ソース検索/置換よりも安全です。

EDIT 2

https://bugs.php.net/bug.php?id=52769

は、だから、すべてのPharについてです。たぶんあなたは単純にpharを放棄し、あなたのコードを正規の作曲家のパッケージとして配布することを考慮するでしょうか? Composer can deal with many type of repositories(つまり、zipファイル)、プロプライエタリであればコードをpackagistにプッシュする必要はありません。

+0

もちろん、私は第三者コードのrealpathを置き換えることはできません。たとえば、https://github.com/yiisoft/yii/issues/526を参照してください。ここでrealpathはPharアーカイブ内でfalseを返します。これは多くの問題を引き起こす可能性があります。 – gremo

+0

あなたのコードだけでなく変更することもできます。それは質問 –

+0

から行方不明だった@MarcinOrlowskiであなたは彼に言う – RiggsFolly

関連する問題