PHP Code Snippets

From macwrench

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