PHP Code Snippets
Ein paar nützliche Hilfsfunktionen für den täglichen PHP-Irrsinn ;-)
Dateisystem[edit]
glob_r()[edit]
Eine rekursive Variante von glob()
function glob_r($dir = "", $flags = 0) {
$files = array();
if(empty($dir) || !is_dir(dirname($dir))) {
return $files;
}
$supp = str_replace(dirname($dir),"",$dir);
$dir = dirname($dir).DIRECTORY_SEPARATOR;
// get all files:
$files = glob($dir.$supp,$flags);
// get all subdirectories:
$_dirs = scandir($dir);
$dirs = array();
foreach($_dirs as $_dir) {
if(substr($_dir,0,1) == ".") {
continue;
}
if(is_dir($dir.$_dir)) {
$dirs[] = $dir.$_dir;
}
}
unset($_dirs);
foreach($dirs as $dir) {
$_files = glob_r($dir.$supp,$flags);
$files = array_merge($files,$_files);
}
return $files;
}
alternativ (ab PHP5) mit der Klasse RecursiveDirectoryIterator der SPL:
<?php
$dir_iterator = new RecursiveDirectoryIterator("/path/to/directory");
$iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $file) {
echo $file, "\n";
}
?>
CLI-Skripte[edit]
Ein paar hilfreiche Funktionen für PHP-CLI Skript
isRunning()[edit]
überprüft mittels ps -ax und grep, ob dieses Skript bereits läuft. Die PHP-Funktion shell_exec() muss dafür verfügbar sein. Funktioniert nur, wenn das wie folgt Skript direkt aufgerufen wird und nicht über den PHP-Interpreter:
./test.php
# und NICHT so
/usr/bin/local/php5 -q ./test.php
Letzterer Aufruf hätte zur Folge, dass in der verwendeten Variable $_ENV["_"] der PHP-Interpreter (in diesem Fall /usr/bin/local/php5 steht und nicht das Skript. Dazu ist ggf. mittels chmod die Ausführungs-Berechtigung entsprechend zu setzen.
public static function isRunning() {
if(!isset($_ENV["_"]) || empty($_ENV["_"])) {
return false;
}
if(substr($_ENV["_"],0,1) == "./") {
$cmd = substr($_ENV["_"],2);
} else {
$cmd = $_ENV["_"];
}
$psaux = shell_exec('ps -ax | grep "'.$cmd.'"');
$psaux = explode("\n",$psaux);
$processes = array();
foreach($psaux as $process) {
if(stripos($process,$cmd) && !stripos($process,"grep")) {
$processes[] = $process;
}
}
if(count($processes) > 1) {
return true;
} else {
return false;
}
}
isConsole()[edit]
schützt ein CLI-Skript davor, über einen Webserver aufgerufen zu werden:
/**
* check if this script has been called from a terminal (console) or via web server.
* @return boolean
*/
public static function isConsole() {
if(
(isset($_SERVER["CLIENTNAME"]) && strtolower($_SERVER["CLIENTNAME"]) != "console") ||
isset($_SERVER["SESSIONNAME"]) ||
isset($_SERVER["HTTP_HOST"])
) {
return false;
}
return true;
}