Hallo,
nach meinem Urlaub mal wieder ein kleiner Artikel zum Thema PHP.
Manchmal ist es nützlich einen in den Hintergrund zu legen, dies dient zum Beispiel dazu bei rechen- und zeitintensiven Prozessen den Benutzer nicht warten zu lassen.
Code
<?php shell_exec("nohup php /var/www/test.php > /dev/null 2> /dev/null & echo $"); ?>
Die PHP Funktion shell_exec führt eine shell Befehl aus.
nohup nabelt ein Programm vom Elternprozess ab
php -q /var/www/test.php führt den PHP Script aus, der im Hintergrund laufen soll.
> /dev/null leitet die Ausgabe ins Nirgendwo um.
Wenn also diese Zeile im Browser geöffnet wird, wird ein Subprozess von php gestartet, das bedeutet der Benutzer kann weitersurfen, während der Prozess auf dem Server weiter läuft.
Leicht ist das z.B. mit einer Endlosschleife zu testen.
Um sich aktive Prozesse am Server anzusehen genügt z.B. folgender shell Befehl:
ps aux | grep php
Ich hoffe der Beitrag hat euch gefallen und freue mich über euer Feedback.
MFG
Andreas
Hallo,
nachdem ich die letzten Tage wenig neues veröffentlicht habe, heute mal etwas interessantes für den ambitionierten PHP Programmierer.
Eine PLZ Umkreissuche in PHP, dazu benötigen wir:
Bei meinen Versuchen hat sich herausgestellt, dass ich die meiste Zeit damit verbracht habe, eine brauchbare Datenbank zu finden und zu formatieren. Hilfe dazu weiter unten, jetzt erstmal etwas Code:
Code
<?
// Zuerst eine Verbindung zur Datenbank aufbauen!
$connect=@mysql_connect("localhost", "user", "pass")
or die("Cant connect to Database");
@mysql_select_db("geo_plz", $connect)or die("Cant select Database");
// die PLZ nach der wir suchen
$plz = '9220';
// der Umkreis in Km
$umkreis = 5;
// Erdradius (geozentrischer Mittelwert) in Km
$radius = 6368;
/* -------------------------- */
$sql_rad = mysql_query("SELECT lon, lat FROM `plz_at` WHERE `plz` = '$plz' ");
$erg_rad = mysql_fetch_object($sql_rad);
// Umrechnung von GRAD IN RAD
$lon = $erg_rad->lon / 180 * M_PI;
$lat = $erg_rad->lat / 180 * M_PI;
// jetzt erfolgt die eigentliche Abfrage
$query = "SELECT ort, plz, (
".$radius." * SQRT(2*(1-cos(RADIANS(lat)) *
cos(".$lat.") * (sin(RADIANS(lon)) *
sin(".$lon.") + cos(RADIANS(lon)) *
cos(".$lon.")) - sin(RADIANS(lat)) * sin(".$lat.")))) AS Distance
FROM plz_at WHERE
".$radius." * SQRT(2*(1-cos(RADIANS(lat)) *
cos(".$lat.") * (sin(RADIANS(lon)) *
sin(".$lon.") + cos(RADIANS(lon)) *
cos(".$lon.")) - sin(RADIANS(lat)) * sin(".$lat."))) <= ".$umkreis."
ORDER BY Distance
";
// die Ausgabe (vereinfacht)
$sql = mysql_query($query);
while( $erg = mysql_fetch_object($sql) ) {
echo '
<pre>', print_r($erg), '</pre>
';
}
?>
Natürlich wäre es jetzt denkbar für jede gefundene PLZ im Umkreis eine Abfrage der Mitglieder oder Filialen zu machen, diesen Spass überlasse ich aber lieber euch :)
Wer die formatierte Datenbank für Deutschland, Österreich und Schweiz braucht oder eine Frage hat, einfach kurz melden.
LG
Andreas
Eine wichtige Adresse die beim Erstellen der Datenbank sowie der Gestaltung der Abfrage hilfreich ist lautet:
http://opengeodb.giswiki.org/wiki/OpenGeoDB_-_Umkreissuche
[UPDATE]
Ich habe die Datenbank online gestellt, übernehme aber keine Garantie für Vollständigkeit und Richtigkeit.
http://www.codejungle.org/code/zip.sql.gz
Database Session handler for php
This are my first example for codejungle, it s a database session handler for php.
I got this example from php.net, but there was some small bugs i.e. on the read method.
more comming soon
Code
<?php
class Session {
// session-lifetime
public $lifeTime;
function __construct ($db) {
// get session-lifetime
$this->lifeTime = get_cfg_var("session.gc_maxlifetime");
// open database-connection
$this->mdb2 =& MDB2::factory($db);
if (PEAR::isError($this->mdb2)) {
$php_errormsg .= $this->mdb2->getMessage();
$php_errormsg .= $this->mdb2->getDebugInfo();
}
session_set_save_handler(array(&$this, 'open'),
array(&$this, 'close'),
array(&$this, 'read'),
array(&$this, 'write'),
array(&$this, 'destroy'),
array(&$this, 'gc'));
register_shutdown_function('session_write_close');
session_start();
return true;
}
function open($savePath, $sessName) {
// get session-lifetime
$this->lifeTime = get_cfg_var("session.gc_maxlifetime");
return true;
}
function close() {
$this->gc(ini_get('session.gc_maxlifetime'));
// close database-connection
return $this->mdb2->disconnect();
}
function read($sessID) {
global $php_errormsg;
// fetch session-data
$query = "
SELECT session_data FROM sessions
WHERE session = '$sessID'
AND session_expires >
".time();
$result = $this->mdb2->query($query);
// return data or an empty string at failure
if (MDB2::isError($result)) {
$php_errormsg .= $result->getMessage();
$php_errormsg .= $result->getDebugInfo ();
return false;
}
list($value)=@$result->fetchrow();
return $value;
}
function write($sessID,$sessData) {
global $php_errormsg;
// new session-expire-time
$newExp = time() + $this->lifeTime;
// is a session with this id in the database?
$query = "
SELECT * FROM sessions
WHERE session = '$sessID'
";
$result = $this->mdb2->query($query);
// if yes,
if($result->numRows()) {
// ...update session-data
$query = "
UPDATE sessions
SET session_expires = '$newExp',
session_data = '$sessData'
WHERE session = '$sessID'
";
}
// if no session-data was found,
else {
// create a new row
$query = "
INSERT INTO sessions (
session,
session_expires,
session_data)
VALUES(
'$sessID',
'$newExp',
'$sessData')
";
}
$result = $this->mdb2->exec($query);
// if something happened, return true
if (MDB2::isError($result)) {
$php_errormsg .= $result->getMessage();
$php_errormsg .= $result->getDebugInfo ();
return false;
} else {
// ...else return true
return true;
}
}
function destroy($sessID) {
global $php_errormsg;
// delete session-data
$query = "
DELETE FROM sessions
WHERE session = '$sessID'
";
$opt_db="OPTIMIZE TABLE sessions";
$result = $this->mdb2->exec($query);
$resultopt = $this->mdb2->exec($opt_db);
// if session was not deleted, return false,
if (MDB2::isError($result)) {
$php_errormsg .= $result->getMessage();
$php_errormsg .= $result->getDebugInfo ();
return false;
} else {
// ...else return true
return true;
}
}
function gc($sessMaxLifeTime) {
global $php_errormsg;
// delete old sessions
$query = "
DELETE FROM sessions
WHERE session_expires <
".time();
$result = $this->mdb2->exec($query);
// return affected rows
if (MDB2::isError($result)) {
$php_errormsg .= $result->getMessage();
$php_errormsg .= $result->getDebugInfo ();
}
return $result;
}
}
?>
If you have question pls just ask