Nette\Database a špatná práva ke cache
- Jan Tvrdík
- Nette guru | 2595
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?
- Jan Tvrdík
- Nette guru | 2595
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
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
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
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)