http://user:pass@example.com pro SP2
Pokud vás štve, že po nainstalování Service Pack 2 pro Windows XP
(případně jiného patche) nefunguje v Internet Exploreru zjednodušené
přihlašování ve formě http://username:password@example.com,
dá se to řešit úpravou registrů.
Vytvořte si soubor iefix.reg s tímto obsahem a pak jej spusťte:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_HTTP_USERNAME_PASSWORD_DISABLE]
"iexplore.exe"=dword:00000000
"explorer.exe"=dword:00000000
Změna se bude týkat všech uživatelů počítače. Pokud ji chcete omezit jen na aktuálního uživatele, zaměňte klíč HKEY_LOCAL_MACHINE za HKEY_CURRENT_USER.
Databázové tabulky: singulár nebo plurál?
Rád bych se zeptal všech ctěných programátorů,
jestli pro databázové tabulky volí názvy v jednotném nebo množném
čísle? Tedy používáte User, Password, Order nebo Users, Passwords, Orders?
Nebo se dokonce přikláníte k českým názvům (uzivatele, hesla,
objednavky)?
Jak nazýváte tabulky obsahující jen cizí klíče? A pole s těmito klíči?
A co v případě programovacích jazyků: dáváte polím názvy
v singuláru nebo plurálu? Tedy $modules = array() nebo
$module = array()?
PHP Memory Leaks
Pojmem memory leaks se označují stavy, kdy aplikace není schopna uvolnit alokovanou paměť. Nedávno tento problém hlouběji rozebíral Roman -Dagi- Pichlík. A před pár dny jsem zjistil, jak katastrofálně je na tom PHP.
Trošku odbočím. Před každým vypuštěním nové
verze Texy! ji testuji tak, že nechám převést několik tisíc připravených
souborů a porovnávám získané výsledky s referenčními. Onehdy jsem
během testování měl spuštěného Správce úloh, záložku Procesy. Řeknu
vám, pěkně mi klesla čelist, když jsem zahlédl, že PHP si ukouslo 900MB
RAM a stále chce víc. Cosi shnilého je v mé aplikaci, pomyslel jsem si, a
jal se hledat problém.
Tak jsem testovací skript + knihovnu Texy! postupně redukoval a redukoval, až jsem to zredukoval na těchto pár řádků:
class MemoryLeakClass {
var $ref;
}
$obj = new MemoryLeakClass();
$obj->ref = & $obj;
unset($obj);
Pokud si myslíte, že příkaz unset() uvolní paměť drženou objektem, jste na omylu. Neuvolní. Můžete si to ověřit tak, že spustíte tento lehce upravený příklad a budete ve Správci úloh sledovat využitou paměť:
class MemoryLeakClass {
var $consumeBigMemory;
var $ref;
}
$obj = new MemoryLeakClass();
// allocate 5MB
$obj->consumeBigMemory = str_repeat('*', 5e6);
$obj->ref = & $obj;
unset($obj);
// wait 10s
sleep(10);
Během čekání (sleep) je krásně vidět, že paměť zůstává blokovaná. To je mazec, co?
Příklad můžete modifikovat i tak, že vytvoříte dva objekty, které budou referencí odkazovat jeden na druhého. I když je společně zrušíte příkazem unset(), vzpomínka na ně zůstane v živé paměti.
Problém se týká prakticky všech verzí PHP, testoval jsem od 4.3.0 do 5.0.4. Prohledal jsem PHP Bugs a našel více než dva roky starý související Bug #22055 Memory leak with references in objects. Reakce jednoho z vývojářů mě dostala:
It won't be fixed in PHP 4 anyway as it has to do with the way objects
Nicméně ani v pětce to vyřešené není.
Nejvíc mě na tom celém trápí, že neznám způsob, jak ty objekty
uvolnit. I když zruším $obj->ref a následně $obj, stejně to
nepomůže. Takže … nevíte o nějaké učebnici Javy pro
začátečníky? ![]()
How to emulate PHP5 object model in PHP4
I spent a lot of time thinking, how to emulate some PHP5's object model features in older PHP4. How get rid tons of ampersands in my source codes. How force objects to not copy itself every time.
So, there is solution.
PHP4: zbavme se ampersandů II.
Nedávno jsem naznačoval způsob, jak v PHP4 předávat objekty bez všudypřítomných ampersandů. Nechci se opakovat a vysvětlovat, k čemu je to dobré – to si prosím nastudujte jinde.
Podařilo se mi najít nové a zcela originální řešení. Má i pár záporů, ty proberu níže. Nejprve se podívejte na tento kód:
class MyClass {
var $parent;
var $children = array();
// všimněte si pětkového konstruktoru
function __construct($parent = null)
{
if ($parent !== null) {
$this->parent = $parent;
$parent->addChild($this);
}
}
function addChild($child)
{
$this->children[] = $child;
}
}
$parent = new MyClass();
$child1 = new MyClass($parent);
$child2 = new MyClass($parent);
V PHP5 dle očekávání vytvoří takovouto hierarchii:

V PHP4 k tomu nedojde. Především kvůli absenci ampersandů, ale také kvůli pojmenování konstruktoru. Proto použijeme Trik.

novější články