Štítek PHP ×

Android Apache Ant Chrome CSS Data Databáze Desocializace Download ESRI Facebook Flash GIS Google Google Maps GPS Hardware HTML Hudba Internet iOS iPhone Jak na to jQuery Kindle mapa Maps Mapy Mashup Mobile MySQL Nezařazeno Obrázky PHP Programování Silverlight Software Studentská tvorba Test Video Všechno možné Webdesign Weblbinky Windows Wordpress Zajímavosti

14. 1. 2012

Minifikace CSS pomocí PHP

Pro minifikaci CSS existuje řada nástrojů (např. YUI Compressor), nejraději však používám klasické PHP:

$regex = array(
  "`^([\t\s]+)`ism" => '',
  "`([:;}{]{1})([\t\s]+)(\S)`ism" => '$1$3',
  "`(\S)([\t\s]+)([:;}{]{1})`ism" => '$1$3',
  "`\/\*(.+?)\*\/`ism" => "",
  "`([\n|\A|;]+)\s//(.+?)[\n\r]`ism" => "$1\n",
  "`(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+`ism" => "\n"
);

$css = preg_replace(array_keys($regex), $regex, file_get_contents(__DIR__ . '/style.css'));

file_put_contents(__DIR__ . '/style.min.css', $css);
#css, #php, #php-minifikace-css, #programovani
7. 1. 2012
15. 10. 2011

Jak okopírovat adresář s celým obsahem v PHP

Složitých a ošklivých funkcí pro kopírování adresářů a podadresářů vč. jejich obsahu jsem viděl několik. Tahle celkem běžná úloha jde vyřešit i jednoduše pomocí PHP iterátoru:

$source = "/foo/bar/dir";
$dest= "/dest/dir";

foreach (
 $iterator = new RecursiveIteratorIterator(
  new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
  RecursiveIteratorIterator::SELF_FIRST) as $item
) {
  if ($item->isDir()) {
    mkdir($dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
  } else {
    copy($item, $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
  }
}
#php, #recursive-copy-of-directory, #recursive-copy-of-folder
25. 9. 2011

Výpočet hash objektu v PHP

Funkce spl_object_hash() má jednu nevýhodu, její výsledek se v čase mění. Pokud objekt naplníte stejnými hodnotami, dostanete při dvou requestech dva různé výsledky. Což nemusí být vždy žádoucí. Někdy potřebujete objekt identifikovat na základě jeho vnitřních hodnot pomocí neměnného řetězce. Takový hash můžete snadno získat například takto:

class Foo {
 private $p;
 public function setProperty($p) {
  $this->p = $p;
 }
 // vypocita hash objektu na zaklade hodnot jeho propert
 public function __toString() {
  return md5(http_build_query(get_object_vars($this)));
 }
}

Pro vypsání/získání hash pak stačí:

$bar = new Foo();
$bar->setProperty('25');
echo $bar;
$hash = (string) $bar;
#hash-object-php, #php
21. 8. 2011

FTP synchronizace s pomocí PHP

Upload souborů na server přes FTP je fakt opruz! Každou chvilku něco zapomenete nahrát. Často zbytečně nahráváte soubory, které se vůbec nezměnili. Něco zapomenete smazat, přejmenovat, přesunout atd. Jednoduše děláte chyby, jste jen člověk!

Proto jsem napsal synchronizační skript v PHP, který vše vyřeší automaticky. Skript udržuje seznam všech lokálních souborů (díky za inspiraci) a pokud se některý soubor změní, tak jej nahraje na server. Pokud naopak soubor smažete, pokusí se jej smazat také na serveru. Použití je vcelku triviální:

require_once 'FtpSync.php';

$ftpSync = new FtpSync('ftp://uzivatel:heslo@nabito.net:21/mojecesta/');
$ftpSync->skip(array ('build.xml', 'skipThisDir', 'sitemap.xml'))
 ->fullSync(realpath('./'));

Skript ignoruje soubory a adresáře začínající tečkou (např. .git .svn .htaccess). Seznam přeskakovaných souborů a adresářů je možné nastavit pomocí metody skip()  - víc jsem zatím nepotřeboval.  Synchronizační proces je jednostranný – soubory se tedy přenáší pouze od vás na server.

Skript umí rozpoznat nejen změnu, ale také smazání souboru – pamatuje si totiž poslední stav. Smazané soubory pak automaticky smaže i na serveru.

Pomocí příznaku repeatOnError() je možné donutit synchronizaci nepodařené akce opakovat, takhle funkce je však spíš experimentální = má několik neduhů.

#ftp-sync-php, #ftp-upload-php, #php