Nette\Database a špatná práva ke cache

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
pawouk
Člen | 172
+
0
-

Nette database vytváří cache s vlastníkem od apache a právy 644, takže cache nelze jednoduše smazat přes FTP. Musíte si buď pres PHP změnit vlastníka nebo práva. Takže by to chtělo aby se cache vytvářela s právem 666 :-)

mkoubik
Člen | 728
+
0
-

zkus si dát do bootstrapu umask(0000);.

bumprask
Člen | 59
+
0
-

Mám stejný problém na FTP se vytváří v cache adresáře a soubory s právy, které neumožní mazat v FTP. umask(0000) v bootstrapu nezabral.

hrach
Člen | 1838
+
0
-

Tak to nema nic spolecneho s Nette\Database, ne?

Eda
Backer | 220
+
0
-

Tohle mi taky trošku pije krev. Když má člověk svůj virtuál, může si dělat, co chce. Na hostingu už je to horší a smazat databázovou cache je mnohdy problém :-(

Jan Tvrdík
Nette guru | 2595
+
0
-

Jen doplním, že něčeho podobného jsem si taky všiml a nedokázal vysvětlit. Když nastavím umask(0), tak všechny složky v temp/cache kromě _Nette.Database.* mají chmod 777 a všechny soubory 666. Složka _Nette.Database.* má ale práva 755 a soubory v ní 644. Tuší někdo, co ten rozdíl způsobuje?

hrach
Člen | 1838
+
0
-

Ha, takze takto :D Takze je to jen u Nette\Database. Zajimave!

Jan Tvrdík
Nette guru | 2595
+
0
-

Bavil jsem se teď o tom s @Majkl578 na Nette jabberu a nic jsem nevyřešili. Doplním, že u mě se to projevuje na Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0–29-generic-pae i686) a PHP 5.4.8–1~precise+1.

Jan Tvrdík
Nette guru | 2595
+
0
-

Ještě skript pro snadnou reprodukci:

#!/bin/bash

wget https://files.nette.org/releases/2.1/NetteFramework-2.1dev-PHP5.3.zip
unzip NetteFramework-2.1dev-PHP5.3.zip
cd NetteFramework-2.1dev-PHP5.3/examples/CD-collection
chmod -R 0777 log temp

sed -i '1i <?php umask(0); ?>' www/index.php

echo "Load CD-collection example (NetteFramework-2.1dev-PHP5.3/examples/CD-collection/www/)"
echo "in order to create cache and press enter"
read foo
ls -lR temp/cache
duke
Člen | 650
+
0
-

pawouk napsal(a):

Nette database vytváří cache s vlastníkem od apache a právy 644, takže cache nelze jednoduše smazat přes FTP. Musíte si buď pres PHP změnit vlastníka nebo práva. Takže by to chtělo aby se cache vytvářela s právem 666 :-)

Lepší řešení než dávat práva naprosto všem, je využít skupin. Tj. adresáři temp nastavíte speciální skupinu a aktivujete „set group ID“ flag přes chmod. Apache potom bude vytvářet nové soubory a pod-adresáře pod stejnou skupinou. Pak už jen stačí přidat všechny uživatele, kteří mají mít práva mazat tyto soubory, do této speciální skupiny.

Edit: Ještě je tedy potom potřeba, aby se používala práva 664, resp. 775 u adresářů, čehož lze docílit voláním:

umask(0002);

Editoval duke (16. 2. 2013 3:56)

redwormik
Člen | 6
+
0
-

Zdavím, dneska jsem na to koukal a problém je nejspíše v tom, že se do cache ukládá až v __destructech při ukončování skriptu, kdy se umask změnila. (Zkuste ji vypsat při ukládání.) Řešením by možná bylo nastavovat umask při zápisu do souboru. Něco jako:

<?php
class UmaskedFileStorage extends Nette\Caching\Storages\FileStorage
{


	/*
	 * Prevents item reading and writing. Lock is released by write() or remove().
	 * Sets umask to 0, because it may differ even during shutdown sequence.
	 * @param  string key
	 * @return void
	 */
	public function lock($key)
	{
		umask(0);
		parent::lock($key);
	}

}
?>

Edit: Tak koukám, že mlátím prázdnou slámu.

Editoval redwormik (14. 5. 2013 19:32)