phpinfo() => PHP 7.03
As root:
a2dismod php7.0
a2enmode php7.3
service apache2 restart
Posts mit dem Label PHP werden angezeigt. Alle Posts anzeigen
Posts mit dem Label PHP werden angezeigt. Alle Posts anzeigen
30.9.19
8.12.17
MySQL - Schnellere Inserts
1. Je mehr Indizes, desto langsamer die Inserts!
Bei 20000 Einträgen dauert das Befüllen auf herkömmlichem Wege auf einem RPI3 ca. 140 Sekunden. Optimiert dauert es ca. 1.5 Sekunden!!!
Code, um Zeitaufwand für Inserts zu vergleichen.
Bei 20000 Einträgen dauert das Befüllen auf herkömmlichem Wege auf einem RPI3 ca. 140 Sekunden. Optimiert dauert es ca. 1.5 Sekunden!!!
Code, um Zeitaufwand für Inserts zu vergleichen.
function my_autoloader($class)DBCache Klasse, gefunden hier.
{
include 'include/' . $class . '.php';
}
$cache=5000;
$usecache = true;
$inserts=10000;
spl_autoload_register('my_autoloader');
$db = new \PDO('mysql:dbname=newdb;host=localhost', 'DB', 'PASSWORD'');
for ($i = 1; $i <= $inserts; $i++)
{
$data[] = ["id" => 1, "zip" => "30159", "name" => "Hannover", "citizens" => 50000];
}
$beginn = microtime(true);
$sql = 'INSERT IGNORE INTO testdaten (id, zip, name, citizens) VALUES ';
if ($usecache)
{
$dbCache = new dbcache($db, $sql, $cache, true);
foreach ($data as $entry)
{
$dbCache->add('(null,' . $db->quote($entry['zip']) . ',' . $db->quote($entry['name']) . ',' . ((int) $entry['citizens']) . ')');
}
$dbCache->flush();
}
else
{
$cache=0;
foreach ($data as $entry)
{
$sql2= $sql . " ('null','" . $entry['zip'] . "','". $entry['name'] . "','" . $entry['citizens'] . "')";
//echo "debug: $sql"; die;
$db->query($sql2);
}
}
$dauer = microtime(true) - $beginn;
echo "Verarbeitung des Skripts: $dauer Sek.<br>";
$sql = "SELECT count(*) from testdaten";
$result = $db->query($sql);
echo "Anzahl der Datensätze: " . $result->fetchColumn() . "<br>";
$db->query("TRUNCATE table testdaten");
$db->query("INSERT INTO performance (inserts, zeit, cache) VALUES"
. "('$inserts','$dauer','$cache')");
class dbcache
{
public $lastQuery;
private $db, $limit, $sql, $cache = [], $auto;
/**
* @param \PDO $db
* @param string $sqlPrefix
* @param int $limit
* @param bool $autoFlush
*/
public function __construct(\PDO $db, $sqlPrefix, $limit, $autoFlush = false)
{
$this->db = $db;
$this->limit = $limit;
$this->auto = $autoFlush;
$this->sql = $sqlPrefix;
}
/**
* @param string $query
*/
public function add($query)
{
$this->cache[] = $query;
if ($this->auto) {
$this->softFlush();
}
}
/**
* Flush cache and query database.
*/
public function flush()
{
if (empty($this->cache)) {
return;
}
// save query for logging, if something goes wrong
$this->lastQuery = $this->sql.implode(',', $this->cache);
$this->db->query($this->lastQuery);
$this->cache = [];
}
/**
* Flush cache if limit is reached.
*/
public function softFlush()
{
if (count($this->cache) >= $this->limit) {
$this->flush();
}
}
}
29.6.17
Ergebnisse aus NMAP in eine MySQL Datenbank schreiben
Es gibt bei Nmap die Möglichkeit die Ergebnisse von Netzwerkscans in eine XML-Datei zu schreiben. Die Weiterverarbeitung mit Linux-Bordmitteln ist jedoch nicht ganz trivial. Jedenfalls habe ich es mit xmlstartlet nicht so richtig hinbekommen.
Nmap wird z.B. gestartet mit
Mit einem Einzeiler, wie
bekomme ich zwar alle Ports nacheinander angezeigt, doch die Zuordnung von IP Adressen zu den offenen Ports muss noch erfolgen.
Da ich das Ergebnis sowieso noch einmal durchgehen muss und alles in eine MySQL Datenbank eintragen will, habe ich mir das Ganze etwas vereinfacht und eine Sprache genommen, die ich etwas besser beherrsche: PHP.
Die Ausgabedatei habe ich testweise so eingeladen und ausgegeben:
Geholfen haben mir die Beispiele auf php.net und zwar die Funktion von efredericksen.
Das PHP Script sieht so aus (quick and dirty):
Mit diesen Daten kann ich nun weiterarbeiten und sie z.B. in eine MySQL Datenbank schreiben.
Vielleicht hat jemand einfachere Lösungen??
Nmap wird z.B. gestartet mit
nmap -Pn 192.168.0178.0/24 -oX output/ZIELDATEI.xml
Mit einem Einzeiler, wie
xmlstarlet sel -t -m '/nmaprun/host' -v 'address[@addrtype="ipv4"]/@addr' -o ":" -v 'ports/port/@portid' -n /var/www/html/netzinfo/output/ZIELDATEI.xml
bekomme ich zwar alle Ports nacheinander angezeigt, doch die Zuordnung von IP Adressen zu den offenen Ports muss noch erfolgen.
Da ich das Ergebnis sowieso noch einmal durchgehen muss und alles in eine MySQL Datenbank eintragen will, habe ich mir das Ganze etwas vereinfacht und eine Sprache genommen, die ich etwas besser beherrsche: PHP.
Die Ausgabedatei habe ich testweise so eingeladen und ausgegeben:
Ausgabe (auszugsweise):
$xml = file_get_contents("output/ZIELDATEI.xml");
$p = \xml_parser_create();
\xml_parse_into_struct($p, $xml, $data, $values);
\xml_parser_free($p);
echo "Index array <br><pre>";
print_r($values);
echo "data array <br><pre>";
print_r($data);
Auch hier ist es nicht so einfach, eine einwandfrei Zuordnung, von z.B. IP - Adressen zu offenen Ports und Mac-Adressen zu treffen.260] => Array ( [tag] => ADDRESS [type] => complete [level] => 3 [attributes] => Array ( [ADDR] => 192.168.178.150 [ADDRTYPE] => ipv4 ) ) [261] => Array ( [tag] => HOST [value] => [type] => cdata [level] => 2 ) [262] => Array ( [tag] => ADDRESS [type] => complete [level] => 3 [attributes] => Array ( [ADDR] => 74:75:48:A4:48:A8 [ADDRTYPE] => mac [VENDOR] => Amazon Technologies ) )
Geholfen haben mir die Beispiele auf php.net und zwar die Funktion von efredericksen.
<?php class XmlElement {
var $name;
var $attributes;
var $content;
var $children;
};
function xml_to_object($xml) {
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $xml, $tags);
xml_parser_free($parser);
$elements = array(); // the currently filling [child] XmlElement array
$stack = array();
foreach ($tags as $tag) {
$index = count($elements);
if ($tag['type'] == "complete" || $tag['type'] == "open") {
$elements[$index] = new XmlElement;
$elements[$index]->name = $tag['tag'];
$elements[$index]->attributes = $tag['attributes'];
$elements[$index]->content = $tag['value'];
if ($tag['type'] == "open") { // push
$elements[$index]->children = array();
$stack[count($stack)] = &$elements;
$elements = &$elements[$index]->children;
}
}
if ($tag['type'] == "close") { // pop
$elements = &$stack[count($stack) - 1];
unset($stack[count($stack) - 1]);
}
}
return $elements[0]; // the single top-level element}
Die Ausgabe ist so, dass ich dann durch alle Ergebnisse der Nmap Ausgabe interieren kann.Das PHP Script sieht so aus (quick and dirty):
$xml=file_get_contents("output/ZIELDATEI.xml");
$object = \xml_to_object($xml)->children;
// Gehe alle Objekte durch:
$anzahl = count($object);
for($i=0; $i<$anzahl; $i++)
{
// IP Adresse
$ip = $object[$i]->children[1]->attributes['addr'];
if(strlen($ip)<1) continue;
echo "Adresse: $ip<br>";
// Rechnername
$name=$object[$i]->children[3]->children[0]->attributes['name'];
echo "Name: $name <br>";
// MAC Adresse
$mac=$object[$i]->children[2]->attributes['addr'];
echo "MAC Adresse: $mac <br>";
$vendor=$object[$i]->children[2]->attributes['vendor'];
echo "Hersteller: $vendor <br>";
// Offene Ports
$anzahlports=count($object[$i]->children[4]->children);
$port=""; $ports="";
for($a=0;$a<$anzahlports; $a++)
{
$port=$object[$i]->children[4]->children[$a]->attributes['portid'];
if(strlen($port)>0)
{
$ports.= $port . ";";
}
}
echo "Offene Ports: $ports <br>";
}
Mit diesen Daten kann ich nun weiterarbeiten und sie z.B. in eine MySQL Datenbank schreiben.
Vielleicht hat jemand einfachere Lösungen??
27.10.16
Joomla - Inhalte per Script auf neue Version übertragen
Ich stand vor dem Problem, die Inhalte einer ziemlich alten Joomla Version (V 1.5) auf eine neue Joomla Installation zu übertragen.
Hier ein schnell dahin gehacktes Script. Dieses muss noch mit den Zugangsdaten der alten und neuen Datenbank angepasst werden. Dann noch die Startwerte von $rgt und $lft anpassen. Ich habe keine Ahnung, wozu sie sind. Auf jeden Fall müssen sie hochgezählt werden. Einfach mal in die Tabelle assets nach den entsprechenden Spalten gucken und die letzten Werte +1 übernehmen in das Script.
Hier ein schnell dahin gehacktes Script. Dieses muss noch mit den Zugangsdaten der alten und neuen Datenbank angepasst werden. Dann noch die Startwerte von $rgt und $lft anpassen. Ich habe keine Ahnung, wozu sie sind. Auf jeden Fall müssen sie hochgezählt werden. Einfach mal in die Tabelle assets nach den entsprechenden Spalten gucken und die letzten Werte +1 übernehmen in das Script.
<?php
$prefix = "c27gy_";
$rgt = 36;
$lft = 35;
class mydatabase
{
var $database = "";
var $prefix = "c27gy_"; // Prefix der Joomla Tabellen
function db_connect($database)
{
$user = "[user]";
$pw = "[PASSWORD]";
$mysqli = new mysqli("localhost", $user, $pw, $database);
/* check connection */
if (mysqli_connect_errno())
{
$error = "Connect failed: " . mysqli_connect_error();
//$this->errorReport($error, true);
exit();
}
$mysqli->query("SET NAMES 'utf8'");
return $mysqli;
}
function getAssetID($title, $lft, $rgt, $name)
{
$sql_asset = "INSERT INTO " . $this->prefix . "assets
(level,name,title, lft, rgt, parent_id, rules)
VALUES
('3', '$name','$title', '$lft', '$rgt', '27','{\"core.admin\":{\"7\":1},\"core.manage\":{\"6\":1},\"core.create\":{\"3\":1},\"core.delete\":[],\"core.edit\":{\"4\":1},\"core.edit.state\":{\"5\":1},\"core.edit.own\":[]}')";
$link=$this->db_connect("[DATABASE]");
$link->query($sql_asset);
//echo "DEBUG $sql_asset <br>";
return $link->insert_id;
}
function truncateTables()
{
$link=$this->db_connect($this->db_new);
// Die u.a. id anpassen!!! Nicht, dass existente Datensätze gelöscht werden
$link->query("DELETE FROM " . $this->prefix . "assets WHERE id > 65");
$link->query("TRUNCATE TABLE " . $this->prefix . "content");
$link->query("TRUNCATE TABLE " . $this->prefix . "content_frontpage");
}
}
$db = new \mydatabase();
// ACHTUNG: NICHT UNBEDINGT NÖTIG!!
//$db->truncateTables(); // Tabellen leeren bzw. Einträge löschen
// Mit den Datenbanken verbinden
$link = $db->db_connect("[DATABASE]");
$link1 = $db->db_connect("[DATABASE_OLD]");
// Daten aus der alten Tabelle holen
$sql_abfrage = "SELECT * FROM jos_content where state=1 ORDER by created DESC";
$result = $link1->query($sql_abfrage);
$zaehler = 0;
while ($row = $result->fetch_array())
{
$zaehler++;
echo $zaehler . " " . $row['alias'] . "<br>";
$title = $row['title'];
$alias = $row['alias'];
$introtext = $row['introtext'];
$fulltext = $link->real_escape_string($row['fulltext']);
$created = $row['created'];
$old_id=$row['id'];
$id = $db->getAssetID($title, $lft, $rgt, "com_content.article." . $old_id);
$rgt+=2;
$lft+=2;
$sql_insert = "INSERT INTO ${prefix}content (
asset_id,
title,
alias,
state,
catid,
introtext,
`fulltext`,
language,
created, publish_up,
featured,
version,
access)
VALUES('$id', '$title',
'$alias',
1,
2,
'$introtext',
'$fulltext',
'*',
'$created', '$created',
1,
2,
1)";
if(!$link->query($sql_insert))
{
echo "Fehler! " . $link->error . "<br>$sql_insert";
}
$content_id=$link->insert_id;
$sql_frontpage="INSERT INTO ${prefix}content_frontpage (content_id, ordering)
VALUES ('$content_id', '$zaehler')";
if(!$link->query($sql_frontpage))
{
echo "Fehler! " . $link->error . "<br>$sql_frontpage";
}
}
7.12.15
PHP - auf Variablen der Elternklasse zurückgreifen
Nachdem ich den Fehler gemacht habe (schon wieder) wichtige Variablen nicht als Array zu definieren, was sich sehr einfach hin- und herschieben lässt, musste ich von der Kindklasse auf Werte von Variablen der Elternklasse zugreifen.
Dies ist zum einen möglich, indem man dort eine Funktion (Methode jajaja) integriert, die die Werte übergibt.
Nach einigem Googlen habe ich allerdings eine für mich praktikablere Lösung gefunden.
Beispiel
Dies ist zum einen möglich, indem man dort eine Funktion (Methode jajaja) integriert, die die Werte übergibt.
Nach einigem Googlen habe ich allerdings eine für mich praktikablere Lösung gefunden.
Beispiel
class A
{
var Variable1;
var Variable2;
var Variable3;
function __construct()
{
include 'meineconfig.php'; // Werte von Variablen a,b,c etc.
$this->Variable1=$a;
$this->Variable1=$b;
$this->Variable1=$c;
}
}
class B extends A
{
function __construct()
{
parent::__construct();
}
}
$B=new B();
echo $B->Variable1;
15.6.15
VServer bei Strato - Plesk 12 - PHP Scripte werden nicht ausgeführt
Wie oft bei Google zu finden, scheint Plesk manchmal ein Problem mit neueren (per Update installierten) PHP Versionen zu haben.
Nachdem ich versehentlich das cgi-Verzeichnis im httpdocs Ordner gelöscht hatte, lief PHP, welches als cgi Modul eingebunden wird, (natürlich) nicht mehr.
Lösung:
PHP unter Servicepakete -> Paketname -> Hosting Parameter -> Scripting als Apache Modul ausführen lassen.
Dann Synchronisierung abwarten und PHP sollte funktionieren.
Nachdem ich versehentlich das cgi-Verzeichnis im httpdocs Ordner gelöscht hatte, lief PHP, welches als cgi Modul eingebunden wird, (natürlich) nicht mehr.
Lösung:
PHP unter Servicepakete -> Paketname -> Hosting Parameter -> Scripting als Apache Modul ausführen lassen.
Dann Synchronisierung abwarten und PHP sollte funktionieren.
24.3.15
Videos umwandeln und per HTML5 wiedergeben
Ausgangslage:
Ich hatte einige Videos mit meinem neuen Quadrocopter erstellt und wollte dieses "mal eben" für andere bereit stellen.
HTML5 unterstützt das Streamen von mp4 Videos, nicht aber von avi´s.
Das die Videos im avi-Format und einer Auflösung von 1280*720 vorliegen, sollen diese zunächst umgewandelt werden.
Das ist sehr einfach unter Linux (hier Ubuntu 12) möglich, wenn avconv installiert ist.
Da der benötigte Codec vermutlich auch noch nicht vorhanden ist, sollte auch ein
hinterher geschoben werden.
Danach lässt sich ein Video sehr einfach konvertieren mit
Ein solches Video lässt sich sehr einfach einbetten in HTML-Code mit
Um die spätere Anzeige grafisch etwas aufzupeppen, bietet es sich an, Thumbnails der Videos zu erstellen. Möchte man von jedem mp4 Video ein Screenshot erstellen und als jpg speichern, lässt sich folgender Einzeiler verwenden:
Damit wird das aktuelle Verzeichnis gescannt, alle mp4 Dateien mit avconv bearbeitet und nach 5 Sekunden Laufzeit ein jpg-Bild im Format 320*180 Pixel gespeichert. Die Auflösung müsste je nach Ausgangsmaterial angepasst werden, um unschöne Ergebnisse zu vermeiden.
Wenn das soweit läuft, lässt sich auch schnell etwas scripten. Mit diesem kleinen Beispiel werden alle mp4 Dateien im Ordner "videos" gescannt und per Link aufgeführt. Wenn unter dem gleichen Dateinamen - mit der Endung jpg - eine Datei existiert, wird diese als Vorschaubild angezeigt und bei Klick auf den Link wird das entsprechende Video angezeigt.
Ich hatte einige Videos mit meinem neuen Quadrocopter erstellt und wollte dieses "mal eben" für andere bereit stellen.
HTML5 unterstützt das Streamen von mp4 Videos, nicht aber von avi´s.
Das die Videos im avi-Format und einer Auflösung von 1280*720 vorliegen, sollen diese zunächst umgewandelt werden.
Das ist sehr einfach unter Linux (hier Ubuntu 12) möglich, wenn avconv installiert ist.
apt-get install libav-tools
Da der benötigte Codec vermutlich auch noch nicht vorhanden ist, sollte auch ein
apt-get install libavcodec-extra-53
hinterher geschoben werden.
Danach lässt sich ein Video sehr einfach konvertieren mit
avconv -i MOVI0000.avi -s 640x360 -vcodec libx264 MOVIE0000.mp4
Ein solches Video lässt sich sehr einfach einbetten in HTML-Code mit
<video width="640" height="360" controls autoplay >..
<source src="MOVIE0000.mp4" type="video/mp4">..
Sorry, dein Browser unterstützt kein HTML5 Video...
</video>
Um die spätere Anzeige grafisch etwas aufzupeppen, bietet es sich an, Thumbnails der Videos zu erstellen. Möchte man von jedem mp4 Video ein Screenshot erstellen und als jpg speichern, lässt sich folgender Einzeiler verwenden:
for i in *.mp4; do avconv -i "$i" -ss 00:00:05 -s 320x180 -vsync 1 -qscale 1 -vframes 1 "${i%.mp4}.jpg"; done
Damit wird das aktuelle Verzeichnis gescannt, alle mp4 Dateien mit avconv bearbeitet und nach 5 Sekunden Laufzeit ein jpg-Bild im Format 320*180 Pixel gespeichert. Die Auflösung müsste je nach Ausgangsmaterial angepasst werden, um unschöne Ergebnisse zu vermeiden.
Wenn das soweit läuft, lässt sich auch schnell etwas scripten. Mit diesem kleinen Beispiel werden alle mp4 Dateien im Ordner "videos" gescannt und per Link aufgeführt. Wenn unter dem gleichen Dateinamen - mit der Endung jpg - eine Datei existiert, wird diese als Vorschaubild angezeigt und bei Klick auf den Link wird das entsprechende Video angezeigt.
// Verzeichnis, in dem die Videos und Vorschaubilder abgelegt sind
//
$dir="videos";
$directory=scandir($dir);
// Wenn Aktion gewählt, erstelle HTML-Gerüst für die selektiert Videodatei
//
if($_GET['action']=="show")
{
$datei=$dir . "/" . strip_tags($_GET['file']);
echo "<video width=\"1280\" height=\"720\" controls autoplay >";
echo "<source src=\"$datei\" type=\"video/mp4\">";
echo "Sorry, your browser doesn't support HTML5 video...";
echo "</video><hr>";
}
// Gehe alle Dateien des Verzeichnisses durch
//
foreach($directory as $file)
{
// Endung mp4?
if(preg_match("/mp4$/", $file))
{
$datei = $dir . "/" . $file;
$size=filesize($datei); // Dateigröße holen
$creationdate=date("Y-m-d" ,filectime($datei)); // Erstellungsdatum der Datei
// Gibt es eine Vorschaudatei?
$thumbnail=$dir . "/" . str_replace("mp4","jpg",$file);
$description="";
if(file_exists($thumbnail))
{
$description ="<img src=\"$thumbnail\" width=\"300\"> <br>";
}
$description.=$file . " " . human_filesize($size) . " [$creationdate]";
echo "<a href=\"" . $_SERVER['PHP_SELF'] . "?action=show& file=$file\">$description</a><br>";
}
}
function human_filesize($bytes, $decimals = 2) {
$sz = 'BKMGTP';
$factor = floor((strlen($bytes) - 1) / 3);
return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}
22.3.15
Wansview und andere Webcams ansteuern mit PHP und einfügen in FHEM
Seit neuestem bin ich Besitzer einer Wansview NC M620W.
1. FHEM HTTPSRV aktiviert (in fhem.cfg):
2. In /usr/share/web Datei index.html erstellt mit folgendem Inhalt:
4. Weblink erstellen (in Kommandozeile von FHEM):
Update:
Kamera fittek Tenvis
Steuerung
curl -H "Authorization: Basic YWRtaW46cmfdaHRub3c5OQ==" "http://192.168.178.221/web/cgi-bin/hi3510/ptzctrl.cgi?-step=1&-act=up&-speed=45"
Geht nicht: (?)
curl --digest -u "admin:2222" "http://192.168.178.223"
Steuerung über PHP-Scripte
Kamera nach rechts drehen
$url="http://192.168.1.202";
$getstring="/web/cgi-bin/hi3510/param.cgi?cmd=ptzctrl&-step=1&-act=right&-speed=13";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url . $getstring);
//curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
//curl_setopt($ch, CURLOPT_USERPWD, 'admin:123456');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/xml',
'Connection: Keep-Alive',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Authorization: Basic [BASE64HASH]'
));
$data = curl_exec($ch);
echo $data;
curl_close($ch);
Einbindung in FHEM:
Dank dieser Anleitung hat es geklappt!1. FHEM HTTPSRV aktiviert (in fhem.cfg):
define myCamWeb HTTPSRV cam /usr/share/web CAM
2. In /usr/share/web Datei index.html erstellt mit folgendem Inhalt:
<embed type="application/x-vlc-plugin" width= "1024" height= "768" name="player" autoplay="yes" loop="yes" target="rtsp://[Benutzer]:[Passwort]@192.168.1.202:554" />3. FHEM aktualisieren
4. Weblink erstellen (in Kommandozeile von FHEM):
define weblink_test weblink iframe https://<ip von fhem>/fhem/cam/index.html
Update:
Kamera fittek Tenvis
Steuerung
curl -H "Authorization: Basic YWRtaW46cmfdaHRub3c5OQ==" "http://192.168.178.221/web/cgi-bin/hi3510/ptzctrl.cgi?-step=1&-act=up&-speed=45"
Geht nicht: (?)
curl --digest -u "admin:2222" "http://192.168.178.223"
5.1.15
Deutsches Datum mit PHP - Anpassung von setlocale
Problem:
Trotz setlocale(LC_ALL, 'de_DE') wollte die Ausgabe eines deutschen Datums nicht gelingen.
Schuld war der nicht unter diesem Namen installierte deutsche Zeichensatz.
Unter Linux lässt sich mittels
anzeigen, welche Zeichensätze installiert sind.
Dort aufgeführt war u.a.
Die Änderung
erbrachte die Lösung!
Schnell überprüfen lässt sich das durch die Ausgabe von
Trotz setlocale(LC_ALL, 'de_DE') wollte die Ausgabe eines deutschen Datums nicht gelingen.
Schuld war der nicht unter diesem Namen installierte deutsche Zeichensatz.
Unter Linux lässt sich mittels
locale -a
anzeigen, welche Zeichensätze installiert sind.
Dort aufgeführt war u.a.
de_DE.utf8
Die Änderung
setlocale(LC_ALL, 'de_DE.utf8');
erbrachte die Lösung!
Schnell überprüfen lässt sich das durch die Ausgabe von
print(strftime('%A %B'));
30.10.14
JPGraph unter Ubuntu 12.04
Nach dem Downloaden des Paketes wollte ich mir die Beispiele ansehen, allerdings kam immer die Meldung
Nach einigem Googlen hatte ich zunächst versucht PHP mit der GD-Bibliothek erneut zu compilieren, bin dabei aber grandios gescheitert :(
Gut, dass Google nach weitere Treffer lieferte. Nach Auskommentieren der folgenden Else-Anweisung in der Funktion der Datei
Dann hatte ich noch das Problem, dass die TTF-Fonts nicht vorhanden waren.
Arial.ttf und arialbd.ttf mussten installiert werden mittels
Ein Zugriff war jedoch weiterhin nicht möglich.
Fehlermeldung:
Das bedeutet, dass PHP keine Rechte für das entsprechende Verzeichnis, in dem die Fonts liegen, besitzt.
Diese Restriktion habe ich innerhalb der Domainkonfiguration des Apache ausgeschaltet
Evtl. müssen die Fonts noch entsprechend kopiert werden oder die Config von JPGraph angepasst werden.
The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version
Nach einigem Googlen hatte ich zunächst versucht PHP mit der GD-Bibliothek erneut zu compilieren, bin dabei aber grandios gescheitert :(
Gut, dass Google nach weitere Treffer lieferte. Nach Auskommentieren der folgenden Else-Anweisung in der Funktion der Datei
jpgraph/gd_image.inc.phpfunction SetAntiAliasing($aFlg=true) {
$this->use_anti_aliasing = $aFlg;
if( function_exists('imageantialias') ) {
imageantialias($this->img,$aFlg);
}
else {
//JpGraphError::RaiseL(25128);//('The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version.')
}
}
Dann hatte ich noch das Problem, dass die TTF-Fonts nicht vorhanden waren.
Arial.ttf und arialbd.ttf mussten installiert werden mittels
apt-get install ttf-mscorefonts-installerDiese befinden sich dann im Pfad:
/usr/share/fonts/truetype/msttcorefonts/
Ein Zugriff war jedoch weiterhin nicht möglich.
Fehlermeldung:
PHP Warning: file_exists(): open_basedir restriction in effect
Das bedeutet, dass PHP keine Rechte für das entsprechende Verzeichnis, in dem die Fonts liegen, besitzt.
Diese Restriktion habe ich innerhalb der Domainkonfiguration des Apache ausgeschaltet
<Directory />
php_admin_value open_basedir none
.......
</Directory>
Evtl. müssen die Fonts noch entsprechend kopiert werden oder die Config von JPGraph angepasst werden.
18.9.13
Screenshots mit PHP erstellen
aptitude install imagemagick wkhtmltopdf
<?php // save this snippet as url_to_png.php // usage: php url_to_png.php http://example.com if (!isset($argv[1])){ die("specify site: e.g. http://example.com\n"); } $md5 = md5($argv[1]); $command = "wkhtmltopdf $argv[1] $md5.pdf"; exec($command, $output, $ret); if ($ret) { echo "error fetching screen dump\n"; die; } $command = "convert $md5.pdf -append $md5.png"; exec($command, $output, $ret); if ($ret){ echo "Error converting\n"; die; } echo "Conversion compleated: $argv[1] converted to $md5.png\n";
Whois-Klasse für PHP
Nach längerer Zeit habe ich mich mal wieder auf die Suche nach einer guten PHP-Klasse für Whois-Abfragen begeben.
Und jetzt bin ich endlich fündig (und glücklich) geworden :)
Hier findet ihr eine Klasse, die endlich das tut, was sie soll.
Chapeau!
Und jetzt bin ich endlich fündig (und glücklich) geworden :)
Hier findet ihr eine Klasse, die endlich das tut, was sie soll.
Chapeau!
23.7.13
PHP und JS Schnipsel - Datumsfunktionen
Datum aus einer MySQL-Datenbank formatieren:
$datum_de = date("d.m.Y ", strToTime($datum));
Datumspicker mit jquery einbinden:
- Framework und CSS einbinden
<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.js"</script>
<script type="text/javascript" src="http://code.jquery.com/ui/1.10.3/jquery-ui.js">
</script> <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" type="text/css" /> - Funktion definieren (geht auch ohne PHP :))
function datepicker($fieldId)
{
?>
<script type="text/javascript">
jQuery(function($){
$.datepicker.regional['de'] = {clearText: 'enternen', clearStatus: 'Auswahl löschen',
closeText: 'schließen', closeStatus: 'Änderungen nicht übernehmen',
prevText: 'vorheriger Monat', prevStatus: 'vorheriger Monat',
nextText: 'nächster Monat', nextStatus: 'nächster Monat',
currentText: 'heute', currentStatus: '',
monthNames: ['Januar','Februar','März','April','Mai','Juni',
'Juli','August','September','Oktober','November','Dezember'],
monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
'Jul','Aug','Sep','Okt','Nov','Dez'],
monthStatus: 'anderer Monat', yearStatus: 'anderes Jahr',
weekHeader: 'Wo', weekStatus: 'Woche des Monats',
dayNames:
['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
dayStatus: 'Setze DD als ersten Wochentag', dateStatus: 'Wähle D, M d',
dateFormat: 'yy-mm-dd', firstDay: 1,
changeMonth: true,
changeYear: true,
initStatus: 'Bitte wählen Sie ein Datum', isRTL: false};
$.datepicker.setDefaults($.datepicker.regional['de']);
});
$(function() {
<?php echo "\$(\"#" . $fieldId . "\").datepicker();";
?>
});
</script>
<?php
}
29.4.13
Verschlüsselte Verbindung mit MySQL Server
Diese Anleitung ist sehr gut, jedoch gab es bei immer noch folgende Fehlermeldung, obwohl die Rechte zu den Pfaden mit chown mysql:mysql entsprechend angepasst wurden:
SSL error: Unable to get certificate from '/etc/ssl/mysql/server.cert'
130429 13:09:59 [Warning] Failed to setup SSL
130429 13:09:59 [Warning] SSL error: Unable to get certificate
Erst dieser Fund hat die Lösung gebracht.
Und wieder war Apparmor mein Problem :(
Auch diese Anleitung ist ganz gut gemacht :)
SSL error: Unable to get certificate from '/etc/ssl/mysql/server.cert'
130429 13:09:59 [Warning] Failed to setup SSL
130429 13:09:59 [Warning] SSL error: Unable to get certificate
Erst dieser Fund hat die Lösung gebracht.
Und wieder war Apparmor mein Problem :(
Auch diese Anleitung ist ganz gut gemacht :)
26.10.12
Header nur auf erster Seite bei TCPDF
TCPDF ist eine sehr schöne Klasse, um mit PHP PDF-Dateien zu generieren.
Was ich allerdings bei den Beispielen nicht finden konnte ist die Möglichkeit, einen Header nur auf der ersten generierten Seite anzeigen zu lassen.
Doch das ist ziemlich einfach, nach dem Includieren von TCPDF wird die Klasse erweitert mit
Dann könnte man eine Variable definieren, mit der man je nach Anwendungsfall das Generieren des Headers auf jeder Seite ein- oder abschalten kann:
Anschließend wird die Header-Funktion modifiziert:
Danach folgen die weiteren Anweisungen für den Header, wie beispielsweise:
Einfach, oder??
Was ich allerdings bei den Beispielen nicht finden konnte ist die Möglichkeit, einen Header nur auf der ersten generierten Seite anzeigen zu lassen.
Doch das ist ziemlich einfach, nach dem Includieren von TCPDF wird die Klasse erweitert mit
class MYPDF extends TCPDF
{
Dann könnte man eine Variable definieren, mit der man je nach Anwendungsfall das Generieren des Headers auf jeder Seite ein- oder abschalten kann:
public $showHeaderOnlyOnFirstPage = true;
Anschließend wird die Header-Funktion modifiziert:
public function Header()
{
if($this->showHeaderOnlyOnFirstPage && $this->page>1) return;
Danach folgen die weiteren Anweisungen für den Header, wie beispielsweise:
// Logo
$logo = K_PATH_IMAGES . PDF_HEADER_LOGO;
$wappen = K_PATH_IMAGES . PDF_HEADER_LOGO_NDS;
//echo $logo; echo "<br>" . $wappen;
$this->Image($logo, 25, 10, 25, '', 'JPG', '', 'T', false, 250, '', false, false, 0, false, false, false);
$this->Image($wappen, 170, 10, 16, '', 'JPG', '', 'T', false, 300, '', false, false, 0, false, false, false);
// Set font
$this->SetFont('helvetica', '', 16);
// Title
$this->SetXY(65, 15);
$this->Cell(10, 15, PDF_HEADER_TITLE, 0, false, 'M', 0, '', 0, false, 'M', 'M');
........
Einfach, oder??
7.9.12
Formulare erstellen mit der Formbuilder Klasse
Den Source-Code gibt es hier:
Aktuell ist Version 3.0, Beispiele zum einfachen Einbau in die eigene Seite sind dort ebenfalls zu finden.
Mein Problem war folgende Fehlermeldung:
Irgendwie gab es diese Klasse in dem heruntergeladenen Paket nicht.
Lösung: selber anlegen
php-form-builder-class
Aktuell ist Version 3.0, Beispiele zum einfachen Einbau in die eigene Seite sind dort ebenfalls zu finden.
Mein Problem war folgende Fehlermeldung:
PHP Fatal error: Class 'Element_HTMLExternal' not found in ........
Irgendwie gab es diese Klasse in dem heruntergeladenen Paket nicht.
Lösung: selber anlegen
class Element_HTMLExternal extends Element_HTML {}oder in den Scripten die Zeilen mit
new Element_HTMLExternalin
new Element_HTMLändern.
15.8.12
Whois für PHP einrichten (Ubuntu 12)
Installation:
&apt-get install php-net-whois
apt-get install php-net-socket
Apache neu starten
Aufruf:
require_once 'Net/Whois.php';
$nw = new Net_Whois;
echo $nw->query ("linux.ie");
GeoIP für Ubuntu einrichten
apt-get install php5-geoip
Download von GeoLiteCity.dat von Maxmind.com und kopieren nach
/usr/share/GeoIP/GeoIPCity.dat (<- Umbenennen!).
Aufruf:
Download von GeoLiteCity.dat von Maxmind.com und kopieren nach
/usr/share/GeoIP/GeoIPCity.dat (<- Umbenennen!).
Aufruf:
$geo = geoip_record_by_name($ip);
Abonnieren
Posts (Atom)
Openhab und Ecoflow Max - API Anbindung
Ich wollte die neu erworbene Powerstation in Openhab einbinden, um den aktuellen Status (Ladestand etc.) über Openhab auswerten zu können. ...
-
Ich wollte die neu erworbene Powerstation in Openhab einbinden, um den aktuellen Status (Ladestand etc.) über Openhab auswerten zu können. ...
-
Nach jahrelanger Nutzung von Putty bin ich vollends auf Kitty umgestiegen, da es einige Funktionen bietet, die über die von Putty hinausgehe...
-
Zuerst wollte ich sipcmd nach dieser Anleitung installieren, doch es trat folgender Fehler auf: src/includes.h:23:19: fatal error: ptli...