ubuntu

Drupal futtatása parancssorból (azaz CLI-ből)

Miért is akarjunk mi parancssorból Drupal-t futtatni? Például akkor hasznos ha egy import szkirptet írunk, ami nagyon sokáig is futhat. Vagy ha a futás kimenete olyan információ, amit aztán a linux parancssorból vagy egy bash scriptben akarunk felhasználni.

Oké, van nekünk Batch API-nk a hosszú futásokhoz, meg Drush is van a CLI-hez. De azért nézzük meg , mit tudunk kezdeni egy egyszerű php fájllal.

Először is érdemes belepillantani a Drupal index.php-ba, a cron.php-va, ha még nem tettük meg. Kiderül, hogy ezek faék egyszerű fájlok, így aztán innen fogunk puskázni.

Első naiv próbálkozás

Legyen a cli.php fájl tartalma ez:

<?php
define
('DRUPAL_ROOT', getcwd());
include_once
DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
?>

Futtassuk így:
# php cli.php

Rögtön kapunk is egy csomó hibát, mert nem létezik a REMOTE_ADDR kulcs egy tömbben. Ez a tömb nem lehet más, csak a $_SERVER. Érthető is, hiszen nem böngészőből hívjuk meg a scriptet. Javítsuk ezt a hibát azzal, hogy pótoljuk ezt az értéket.

<?php
$_SERVER
['REMOTE_ADDR'] = '127.0.0.1';
?>

Tegyünk egy kis óvintézkedést, és állítsuk le a szkript futását, ha nem parancssorból futtatjuk. Ezt így tehetjük meg:

<?php
if (php_sapi_name() !== 'cli') {
  exit(
1);
}
?>

Ezzel teljesen kizárjuk a webszervert, így a legtöbb biztonsági kockázatnak elejét vettük.

A teljes kód

Nos nagyjából ennyi, a teljes kód mindössze ennyi:

<?php
define
('DRUPAL_ROOT', getcwd());

if (
php_sapi_name() !== 'cli') {
  exit(
1);
}

$_SERVER['REMOTE_ADDR'] = '127.0.0.1';

include_once
DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
?>

Ezután bármit megtehetünk a kis php szkriptben. Például meghívhatunk egy hook-ot minden modulban így:

<?php
 module_invoke_all
('xmlrpc');
?>

Vagy bármely modul egy tetszőleges függvényét így:

<?php
 import_modulom_import_fuggvenye
();
?>

Fontos, hogy kinek a nevében fut!

Egy dologra viszont oda kell figyelni: a php-t futtató szerver felhasználó. Debian/Ubuntu rendszereken www-data az alapbeállítás, de szervertől függően ez bármi lehet. A fájlkezelés miatt fontos, ugyanis a fájlokat tartalmazó könyvtárban (pl.: sites/default/files) minden fájlnak a webszerver a tulajdonosa, ezzel lehet írni-olvasni a fájlokat. Ha mi egy másik felhasználó nevében futtatjuk a ki import php szkriptünket, ami mondjuk képeket is importál, akkor bizony az új vagy módosított fájloknak más lesz a tulajdonosa. És ez baj, mert akkor később a web-ről már nem tudjuk módosítani, vagy akár törölni ezeket.

Ezerféle módon megoldhatjuk ezt a problémát, a két legegyszerűbbet mutatom be.
Legjobb megoldás, ha a php-t a megfelelő felhasználó nevében futtatjuk. Ha pl. www-data nevében fut az Apache vagy másik webszerver, akkor így:

# sudo -u www-data php cli.php

Erre viszont nincs mindig lehetőség. Egyszerű, de nagyszerű megoldás az is, ha a cli.php futása után egyszerűen átadjuk a megfelelő felhasználónak a files könyvtár tartalmát:

# chown -R www-data sites/default/files

Ez az egész ötlet nekem egy importálás miatt kellett, és nagyon jól bevált. Remélem másnak is hasznos lesz.

Debian és Ubuntu szervereken a Drupal sessions tábla túl nagyra nő

Probléma: Ha Debian vagy Ubuntu szerveren futtatsz Drupal-t és a session kezeléssel kapcsolatos beállításokat nem állítottad át a php.ini-ben, akkor a Drupal sessions tábla soha nem lesz ürítve, ezért túl nagyra fog duzzadni, napról napra egyre jobban lelassítva a weboldaladat.

Megoldás: A Drupal settings.php-be szúrd be ezt a két sort:

<?php
ini_set
('session.gc_probability',   5);
ini_set('session.gc_divisor',       100);
?>

és esetleg finomhangold ezt a sort:
<?php
ini_set
('session.gc_maxlifetime',   200000);
?>

Egy másik megoldás, ha a .htaccess fájlba vagy az Apache virtualhost definícióba szúrod be ezt a két sort:
php_value 'session.gc_probability' 5
php_value 'session.gc_divisor' 100

Miért csak Debian alapú szervereken?

Nade mit is csinál ez a két sor és miért kell ezzel külön foglalkozni a Debian alapú szervereken?

Ahhoz, hogy megértsük a problémát, bele kell kicsit mélyednünk a Drupal lelkivilágába.

Nem csak az asztali gépemen fut Ubuntu, hanem szervernek is szívesen használom. Így vettem észre, hogy az f1vilag.hu oldalon, ami egy elég forgalmas site, a session táblában nagyon sok bejegyzés van. Hamar kiderült, hogy a táblából soha nem kerülnek ki a régi sorok, mindig csak az újak kerülnek beszúrásra.

Utánanéztem, hogy ez hogyan lehetséges, és egy kis keresgélés után kiderült, hogy a Drupal a sess_gc nevű függvényében ürítené a táblát. Az is hamar kiderült, hogy ezt a függvényt nem közvetlenül hívja meg a Drupal, hanem indirekt módon, a PHP-t kéri meg, hogy néha hívogassa ezt a függvényt, amikor a PHP azt jónak látja. Ezt egyébként úgy éri el a Drupal, hogy a session_set_save_handler függvény 6. paramétereként megadja visszahívandó callback függvényként a 'sess_gc'-t.

A PHP egy véletlen sorsolással dönt arról, hogy mikor kell meghívni a munkamenet szemétgyűjtőt, ismertebb nevén a session garbage collectort. A fent beállított értékek esetén, minden 100 oldalletöltés esetén átlagosan 5 alkalommal fog végrehajtódni a takarítás.

Ez mint szép és jó, de miért nem teszi ezt meg magától a PHP Debian alatt és miért teszi meg más rendszerek alatt? A választ megkapjuk, ha bepillantunk a php.ini ide vonatkozó részébe egy Ubuntu vagy Debian alatt:

; Define the probability that the 'garbage collection' process is started
; on every session initialization.
; The probability is calculated by using gc_probability/gc_divisor,
; e.g. 1/100 means there is a 1% chance that the GC process starts
; on each request.

; This is disabled in the Debian packages, due to the strict permissions
; on /var/lib/php5.  Instead of setting this here, see the cronjob at
; /etc/cron.d/php5, which uses the session.gc_maxlifetime setting below.
; php scripts using their own session.save_path should make sure garbage
; collection is enabled by setting session.gc_probability
;session.gc_probability = 0
session.gc_divisor     = 100

Debian alatt tehát ki van kapcsolva a php beépített session garbage collection funkciója, és helyettesítve van egy ütemezett feladattal (cronjob). Ami viszont csak annyit tesz, hogy a php session fájljait törölgeti félóránként. Ezért nem lesz soha meghívva a drupal sess_gc függvénye és ezért nő a sessions tábla a végtelenségig. A php.ini-ben, mint fent olvashattuk, nem is érdemes visszakapcsolni ezt a funkciót. Inkább a Drupal-ban állítsuk vissza ezt a funkciót, amelynek hatására már rendszeresen meg fog hívódni a sess_gc függvény és nem nő a végtelenségig a sessions tábla.

Wake On Lan beállítása Linuxon 3 egyszerű lépésben

Mire jó?

A Wake On Lan segítségével, egy teljesen kikapcsolt számítógépet be lehet kapcsolni, amivel sok érdekes dologra nyílik lehetőség: Például az otthoni asztali gépen tárolt dokumentumok elérése nyaralás alatt. Vagy padláson, esetleg pincében, elhelyezett házi letöltés vagy média szerver. Hogy csak kettőt említsek a lehetőségekből.

Hogyan működik?

Dióhéjban úgy működik, hogy a gép kikapcsolásakor a hálózati kártya továbbra is áram alatt marad, és figyeli a hálózatot egy un. Magic Packet csomagra várva. Ez nem egy szokásos TCP vagy UDP csomag, mert a hálózati kártyának nincs IP címe. Helyette egy un. MAC address segítségével van megcímezve a kártya. Ha ez a csomag megérkezik, akkor a hálózati kártya küld egy jelet az alaplapnak, aminek hatására a számítógép bekapcsol.

Mi kell hozzá?

A fent leírtakból is látszik, hogy az alapnak és a hálózati kártyának, amely ma már általában az alaplap része, kell támogatnia a felébresztést hálózaton keresztül. Az alaplap BIOS-ában be kell kapcsolni ezt a funkciót, a WOL és a WakeOnLan körül érdemes keresgélni.

Ha nem integrált hálókártyával próbálkozunk, akkor az alaplapot és a kártyát egy speciális kábellel össze kell kötni. Ezt a kábelt általában mellékelik a kártyához.

Wake On Lan beállítása 3 lépésben

1. lépés: MAC address

A felébreszteni kívánt számítógépnek derítsük ki a MAC address-ét. Ehhez parancssorban futtassuk le az ifconfig parancsot. Ekkor egy ehhez hasonló kimenet fogad minket:

A HWaddr utáni rész, a képen fehérrel kijelölt, a MAC cím. Valami ehhez hasonlónak kell lenni: 01:23:45:ab:cd:ef

Ha több hálózati kártya van, fontos, hogy azt nézzük, amelyiket használni akarjuk majd az ébresztéshez. Mindenképpen az eth0, eth1 stb... kezdetű sorok valamelyikét keressük. Ha csak egy hálókártya van, akkor az az eth0 azonosítójú.

2. lépés: felébreszteni kívánt gép

Állítsuk be a felébreszteni kívánt számítógépet. Hozzunk létre egy wakeonlan nevű fájlt a /etc/init.d/ könyvtárban és írjuk bele ezt:

#!/bin/sh
ethtool -s eth0 wol g

Itt is fontos, hogy melyik ethernet azonosítót használjuk, tehát fenti eth0 részt írjuk át, ha több hálózati kártya van.

Ha nincs a gépen telepítve az ethtool parancs, akkor telepítsük, Debian/Ubuntu alatt így:

sudo apt-get install ethtool.

Adjunk a fájlnak adjunk futási jogot:

sudo chmod a+x /etc/init.d/wakeonlan

Végül állítsuk be, hogy minden bekapcsolás után fusson le a szkript:

sudo update-rc.d -f wakeonlan defaults

Most futtassuk le ezt a szkriptet kézzel (/etc/init.d/wakeonlan) majd kapcsoljuk ki a számítógépet. Ha mindent jól csináltunk, és a hálózati kártya bemeneténél van egy led, ami jelzi a WOL állapotát, akkor ennek most világítania kell kikapcsolt állapotban is.

3. lépés: távoli ébresztés

Nincs más hátra, mint a hálózat egy másik gépéről elindítani a csodacsomagot (Magick Packet). Ehhez többféle programot lehet használni, én a wakeonlan nevűt szoktam. Nem túl bonyolult, mindössze az első lépésben megszerzett MAC address-t kell neki megadni:

wakeonlan 01:23:45:ab:cd:ef

Ha mindent jól csináltunk, akkor fel kell ébrednie a kiszemelt számítógépnek.

Fontos, hogy az ébresztő számítógép ugyanazon a hálózaton legyen, mint az ébreszteni kívánt. Interneten keresztül ezt meg tudjuk tenni egy linuxos routerre bejelentkezve, vagy a routeren a megfelelő csomag továbbítás beállítása után. A router konfigurálása megérne egy másik bejegyzést, de ha beállítottuk, akkor az internetre kapcsolt bármelyik gépről így tudjuk indítani az ébresztést:

wakeonlan -p9 -i host.vagy.ip.cim 01:23:45:ab:cd:ef

Ha valakinek nem sikerül, kérdezzetek a hozzászólásoknál, és ha tudok segítek.

12 háttérkép Ubuntu 10.04 LTS-hez

Csak néhány napja lehet letölteni az új Ubuntut, máris egy csomó, ehhez készült háttérképet lehet találni, szerte az interneten. Összeszedtem azokat, 12 háttérképet találtam, amiket most egy csokorban feltetszek ide, ezzel is népszerűsítve a linuxot.

Ha valaki talál még, írjátok be a hozzászólásokban, vagy küldjétek el email-ben és beteszem a többi közé.

Tipp: Ha frissítettél már az Ubuntu 10.04-re és a régi, 9.10-es hivatalos háttérképeket keresed, akkor az ubuntu-wallpapers-extra csomagot tedd fel:

sudo apt-get install ubuntu-wallpapers-extra

Ezt a tippet nortai írta az ubuntu.hu-n.

És akkor a háttérképek:


1920 x 1200
forrás


1920 x 1200
forrás


1024 x 576
forrás


1920 x 1440
forrás


1600 x 1086 áttetsző (transparent)
forrás


1280 x 1024
forrás


1600 x 1000
forrás


1280 x 800
forrás


1280 x 1024
forrás


1600 x 1200
forrás


1600 x 1200
forrás


1440 x 900
forrás

Ubuntu 10.04 Lucid Lynx

Ubuntu 10.04 Lucid Lynx képernyőkép

Már csak egyet kell aludni, és április 29-én megjelenik az Ubuntu Linux legújabb tagja, a Lucid Lynx. Ez a verzió ráadásul egy LTS, azaz hosszú távon támogatott kiadás lesz. Ezért aztán a fejlesztők azt ígérték, hogy a stabilitásra koncentráltak, nem az új funkciókra. Ennek ellenére jó pár új dolog került ebbe a kiadásba. Mivel már úgyis rég frissítettem a blogom, gondoltam ez egy jó alkalom, hogy újra felvegyem a fonalat.

Én nem a hivatalos közleményben felsorolt újdonságokat fogom visszhangozni, hanem azt a néhány dolgot veszem szemügyre, amit a leggyakrabban használok. A most következőket a Release Candidate alapján írom, nagy valószínűséggel ez már egy az egyben megegyezik a végleges kiadással.

Firefox 3.6

Ma már szinte bármit csinálok, az egy böngészőablakban fut, úgyhogy számomra a Firefox 3.6-os verzióra frissítése messze a legfontosabb újdonsága a Lucid Lynxnek. A Firefox nem kifejezetten egy villámgyors állatfajta, ezért minden nagyobb kiadásnál lélegzetvisszafojtva tesztelem a böngésző sebességét, és most sem volt ez másképpen.

Hogy valóban igazságos legyen a két teszt, két frissen készített USB kulcsra létrehoztam egy Ubuntu 9.10 (Firefox 3.5) és egy Ubuntu 10.04 LTS (Firefox 3.6) USB-ről indítható telepítést. Mindkét rendszer 32bit-es. Azért 32 bit, mert ez az a verzió, amit a Canonical, az operációs rendszer mögötti kiadó cég, is inkább előnyben részesít asztali gépek esetén.

A teszteket a dromaeo.com weboldallal készítettem, amely natív Javascript futtatási és számolási teljesítményt mér. Íme a két teszteredmény:

Ebből a tesztből az derül ki, hogy az új Firefox 36%-al gyorsabb. Ez azért egész jó fejlődés.

VirtualBox 3.1.6

Nem tudom, ki hogy van vele, de én rengeteget használom a VirtualBoxot, és imádom. Volt (van?) viszont egy tulajdonsága, ami érthetetlenül butuska. Ez pedig a pillanatkép (snapshot) funkció. Mindig csak a legutolsó állapotot tudtuk használni, vagy egy régire visszatérni, ezzel eldobva az aktuális legutolsó állapotot. VirtualBox 3.1-től elvileg már nincs ez a kötöttség, ami nagyon jó hír, de én picit szkeptikus vagyok. Ennek még mindenképpen utánanézek alaposabban is, de ha tényleg így van, akkor örüljünk, hogy a VirtualBox snapshotok már nem csak lánc, hanem fa alakot is ölthetnek.

Ezen kívül állítólag van 2D grafikus gyorsítás Windowsos vendég (guest) gépeken és további teljesítmény tuning virtualizációs technológiát (VT-x, AMD-V) támogató processzor esetén.

OpenOffice 3.2

Alig két hónapos az irodai programcsomag legújabb, 3.2-es verziója, mégis belefért ebbe a kiadásba. Nem használom túl sokat ezeket a programokat, de azért jó tudni, hogy bekerült. Főleg, hogy ez az Ubuntu LTS kiadás, amit feltételezem többen használnak majd egy normál kiadásnál.

GNOME 2.3

Az új grafikus felület biztosan tengernyi új dolgot tartalmaz, én csak néhányat emelnék ki:

A Nautilus fájlkezelő képes osztott képernyős működésre, amit az F3 gombbal tudunk előcsalogatni. Majd a napi használat közben kiderül, mennyire jó ez a funkció.

A Gedit képes helyesírás ellenőrzésre forráskód sztringekben és kommentekben. Na erre kíváncsi leszek :)

Az alapértelmezett terminál program, a gnome-terminal, egy új beállítással végtelen sok előzmény sort képes megjegyezni (unlimited scroll history). Néha ez is jól jöhet.

LAMP webszerver

Az Ubuntu 10.04-be, belekerült a PHP legfrissebb stabil verziója, a PHP 5.3, benne néhány komoly újítással, mint például a névterek vagy a lambda függvények.
http://php.net/releases/5_3_0.php

Az Apache és a MySQL már eddig is a legfrissebb főverziókat (2.2 és 5.1) tartalmazta, így itt nincs előrelépés.

Boot

Mindenhol nagyon hirdetik, hogy az új Ubuntu mennyire gyorsan bootol. Engem soha nem érdekelt különösebben, hogy milyen gyorsan bootol a gép, de bevallom, ez az ugrás tényleg szembeötlő!

Rengeteg dolog van, amiről itt egyáltalán nem írtam, pl. az új lila téma, ahol minden a bal oldalon van, aminek jobb oldalon kéne lenni. Vagy hogy majdnem Yahoo lett az alapértelmezett kereső. De ezeket úgyis elolvassátok majd máshol.

Feliratkozás RSS - ubuntu csatornájára