需要在每个PHP文件的开头添加单行吗?

时间:2011-11-29 12:46:06

标签: php recursion regex

想知道是否有一种快速方法可以递归查找以.php结尾的每个文件,并在开头添加此行..

<? $DOCUMENT_ROOT = '/usr/share/nginx/html';?>

尝试过register_globals等没有球,所以这看起来是最简单的方法。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

$path = "somedir/";    

$directory = new RecursiveDirectoryIterator($path);
$iterator  = new RecursiveIteratorIterator($directory);
$regex     = new RegexIterator($iterator, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH);

foreach($regex as $file) { 
    $file     = $file[0];       
    $contents = 
        "<?php $DOCUMENT_ROOT = '/usr/share/nginx/html';?>\n" 
        . file_get_contents($file);    

    file_put_contents($file, $contents);        
}

我不知道它将如何执行大量文件,明智地使用。顺便说一句,您应avoid the short open tag并始终使用<?php


在更新之前我已经回答了问题,将"<?php $DOCUMENT_ROOT = '/usr/share/nginx/html';?>\n"作为每个文件中所需的行。这是一个坏主意,正如@DanRay所评论的那样:

  

您不希望在每个文件的顶部对此值进行硬编码。您想要添加对设置的单个配置文件的引用。我知道它不太可能改变,但它是一个配置值,配置值应保存在一个地方,而不是在整个代码库中散布。


没有RegexIterator的替代实施:

$path = "somedir/";    

$directory = new RecursiveDirectoryIterator($path);
$iterator  = new RecursiveIteratorIterator($directory);

foreach($iterator as $file) {
    $path = $file->getRealPath();

    if(
        !$file->isFile()
        || !preg_match('/^.+\.php$/i', $path)
    ) {
        continue;
    }

    $contents = 
        "<? $DOCUMENT_ROOT = '/usr/share/nginx/html';?>\n" 
        . file_get_contents($path);    

    file_put_contents($path, $contents); 
}

答案 1 :(得分:2)

使用PHP 4.2.3+,您只需使用PHP指令auto_prepend_file

例如,在php.ini

auto_prepend_file = /var/www/html/myproject/myprepend.php

另一种可能性是在.htaccess文件中使用该指令:

php_value auto_prepend_file /var/www/html/myproject/myprepend.php

其中/var/www/html/myproject/myprepend.php(或您使用的任何路径)只包含

<?php
$DOCUMENT_ROOT = '/usr/share/nginx/html';