Tomasz Zadora

Tomasz Zadora programuję

Temat: file_exists i APC

Witam,

zastanawiam się - czy jeżeli sprawdzam przez file_exists obecność pliku klasy lub skryptu który jest już załadowany do APC to czy w takim przypadku jest wykonywana operacja IO, czy też najpierw sprawdzane to jest przez APC (bez względu na to czy opcja apc.stat jest 0 czy 1) i jeżeli plik jest w keszu zwracane jest true ?

Podobnie w odwrotnej sytuacji - jeżeli sprawdziłem wcześniej (poprzedni request) przez file_exists obecność pliku i on nie istnieje, to czy ponowne sprawdzenie wywoła znowu IO czy też jest to w jakiś spoósb przechwytywane przez APC (fajnie by było....).Tomasz Zadora edytował(a) ten post dnia 16.07.11 o godzinie 01:35
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: file_exists i APC

o ile mi wiadomo apc nie keszuje stanu maszyny wirtualnej ktora wykonuje opkod, wiec raczej za kazdym razem puka do IO, testuje operacje z file_exists na hudsonie na kilku maszynach i jedynie na fbsd z tego co pamietam byly jakies jazdy, ale na klonach produkcji gdzie jest apc nie bylo zadnych dziwnych sytujacji, przy load testach takze
Tomasz Zadora

Tomasz Zadora programuję

Temat: file_exists i APC

no to szkoda, bo właśnie zależało by mi, żeby tych wywołań IO nie było :)

Dlaczego ?

Ponieważ jeżeli mam na maszynie kilka aplikacji które korzystają np. ze wspólnego zestawu klas i jednocześnie mają jakieś swoje własne klasy to w autoloaderze chciałbym zrobić tak że najpierw jest sprawdzenie przez file_exists czy plik istnieje w ścieżce lokalnej, jeżeli TAK - dołączenie, jeżeli NIE, już bez sprawdzenia dołączenie ze ścieżki SHARED.

W takim jednak razie raczej zrobie jakąś tablicę z mapą lokalnych klas danej aplikacji i mapa będzie sprawdzona zamiast wywołania IO, jeżeli nie będzie w mapie - dołączenie ze ścieżki SHARED.

To tak w kontekście nowego frameworka nad którym coś tam powoli zaczynam więcej grzebać (http://www.goldenline.pl/forum/php-dreamframework/)Tomasz Zadora edytował(a) ten post dnia 16.07.11 o godzinie 01:38
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: file_exists i APC

nie bardzo widze jaki zysk ma to dac? roznica na poziomie milisekund w czasie wykonania aplikacji bedzie miala znaczenie dopiero przy kilku tysiacach requestow na sekunde, a zaden app w golym php tyle nie wytrzyma (no moze poza helloworld)
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: file_exists i APC

btw, nawet jezeli proces php puka dalej do IO to przynajmniej w linuchu stan dysku jest cachowany :)
Tomasz Zadora

Tomasz Zadora programuję

Temat: file_exists i APC

TO znaczy konkretnie chodzi Ci o nie kopiowanie tych samych klas (redundancję) czy też o różnice między file_exists a mapą ?

Bo jeżeli chodzi o to drugie to czym mniej operacji IO tym lepiej.

Jeżeli chodzi o to pierwsze to nie tyle mam na myśli wydajność a raczej łatwość masowych zmian - jeżeli mam np. 10 aplikacji na jednym serwerze, wszystkie korzystają z tych samych klas to łatwiej zrobić zmianę w jednym pliku niż chrzanić się z przegrywaniem dziesięciu. Po za tym no trochę pamięci się zaoszczędza w APC na inne rzeczy.

konto usunięte

Temat: file_exists i APC

eee... yyyyy... ale czarujecie.

spl_autoload_register('..wczytywacz klas z własnego katalogu');
spl_autoload_register('..wczytywacz klas ze współdzielonego katalogu');

To powinno rozwiązać sprawę...
Tomasz Zadora

Tomasz Zadora programuję

Temat: file_exists i APC

Tak czy inaczej sposób jest ten sam: czy to wewnątrz jednej funkcji __autoload czy dwóch osobnych w spl - najpierw (w pierwszej funkcji) trzeba albo sprawdzić przez file_exists obecność pliku albo przechwycić wyjątek i jeżeli nie ma klasy w lokalnej ścieżce, skorzystać ze shared.

Różnica jest może taka, że SPL jest bardziej elastyczne w sensie rozbudowy frameworka.

konto usunięte

Temat: file_exists i APC

Oj bo chyba nie.
W SPL nie musisz nic sprawdzać, żadnego file_exists, is_file, żadnych throw ani catch.
Starczy require i tyle, nawet return nie jest potrzebny.
Tomasz Zadora

Tomasz Zadora programuję

Temat: file_exists i APC

Sprawdziłem i musisz :) Zresztą to by było dziwne gdybyś dał require lub include do nieistniejącego pliku i nie wywołałoby to błędu, mój testowy autoloader:


namespace dmf;

const DIR_ROOT = 'c:\Projekty\DMFramework\www-example';
const DIR_SHARED = 'c:\Projekty\DMFramework\dmf-shared-dir';
const DIR_LOCAL = 'c:\Projekty\DMFramework\www-example\dmf-local-dir';

const URL_ROOT = 'http://dmf.dom';
const URLS_ROOT = 'http://dmf.dom';
const DOMAIN_WWW = 'dmf.dom';

// Temporary/debug
ini_set("log_errors", true);
ini_set("error_log", \dmf\DIR_ROOT.'/error-log.txt');
ini_set("log_errors_max_len", 5000);

/**
* Autoloader PSR0 compatible, see: http://groups.google.com/group/php-standards/web/psr-0-final-proposal
*/
class Autoloader
{
/**
* Class name to file name converter.
*
* @param string $className
* @return string
*/
public static function &getFilename($className)
{
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
if ($lastNsPos = strripos($className, '\\'))
{
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

return $fileName;
}

/**
* Load class from local dir.
*
* @param string $className
* @return boolean - true: success
*/
public static function autoloadLocal($className)
{
if (!\file_exists( \dmf\DIR_LOCAL.'/class/'.\dmf\Autoloader::getFilename($className))) return false;

try
{
require \dmf\DIR_LOCAL.'/class/'.\dmf\Autoloader::getFilename($className);
}
catch (Exception $e) { \trigger_error($e->getMessage()); }

return true;
}

/**
* Load class from shared dir.
*
* @param string $className
* @return boolean - true: success
*/
public static function autoloadShared($className)
{
require_once \dmf\DIR_SHARED.'/class/'.\dmf\Autoloader::getFilename($className);
return true;
}
}

////////////
// Registering autoloaders
\spl_autoload_register('\dmf\Autoloader::autoloadLocal');
\spl_autoload_register('\dmf\Autoloader::autoloadShared');


I teraz jak sobie wkleisz ten kod do edytora: i zlikwidujesz linię numer 52, to próba załadowania nieistniejącej klasy z lokalnego katalogu zakończy się "fatal error" i błędem HTTP 500.Tomasz Zadora edytował(a) ten post dnia 16.07.11 o godzinie 15:41

konto usunięte

Temat: file_exists i APC

I widzisz, masz rację - rozpędziłem się sprawdzanie istnienia pliku jest potrzebne...

Może zamiast pieprzyć się ze sprawdzaniem pliku, zrób 3 loader, odpalany jako pierwszy, a bazujący na tablicy array('namespace\class' => absolute\path\to\file.php);
Sposób tworzenia mapy to już zupełnie inna kwestia.

Ale mam pytanie - po jaką cholerę robisz z tego obiekt?
Wytłumacz mi różnicę miedzy Autoloader::autoloaderLocal(..) a autoloaderLocal()?
Tomasz Zadora

Tomasz Zadora programuję

Temat: file_exists i APC

Właśnie się zastanawiam między mapą a file_exists i na razie zostanie file_exists.

Sama mapa gdyby była tworzona to przez "generator" czyli to IDE do frameworka.

Wydaje mi się też, że mapę można by sprawdzać właśnie w autoloaderLocal bez potrzeby dokładania jeszcze 3-ciej funkcji - po prostu zamiast file_exists.

Co do samego sposobu - pewnie można to zrobić na wiele sposobów, zrobiłem tak żeby nie tworzyć w głównej przestrzeni nazw dodatkowej funkcji (możliwość kolizji z czyms), tylko mieć to pod \dmf.

Z funkcji autoloaderLocal wywalę jeszcze try ... catch bo jest tam niepotrzebne.Tomasz Zadora edytował(a) ten post dnia 16.07.11 o godzinie 20:50

Następna dyskusja:

APC a sprawa hostingów




Wyślij zaproszenie do