cvs: phpdoc /tr/features error-handling.xml persistent-connections.xml remote-files.xml
| From: | Serdar Soydemir | Date: | Mon, 10 Dec 2001 02:24:49 +0000 |
| Subject: | cvs: phpdoc /tr/features error-handling.xml persistent-connections.xml remote-files.xml | ||
| Groups: | php.doc | ||
| Request: | Send a blank email to phpdoc+get-969339596@lists.php.net to get a copy of this message | ||
tpug Sun Dec 9 21:24:49 2001 EDT
Added files:
/phpdoc/tr/features error-handling.xml persistent-connections.xml
remote-files.xml
Log:
complete translation by Alper
Index: phpdoc/tr/features/error-handling.xml +++ phpdoc/tr/features/error-handling.xml <?xml version="1.0" encoding="iso-8859-1"?> <!-- $Revision: 1.1 $ --> <chapter id="features.error-handling"> <title>Hata İþlemleri</title> <para> PHP'de pek çok uyarı çeþidi vardır. Bunlar: <table> <title>PHP uyarı çeþitleri</title> <tgroup cols="4"> <thead> <row> <entry>Değer</entry> <entry>Sabit</entry> <entry>Tanım</entry> <entry>Not</entry> </row> </thead> <tbody> <row> <entry>1</entry> <entry>E_ERROR</entry> <entry>hayati çalıþma hataları</entry> <entry></entry> </row> <row> <entry>2</entry> <entry>E_WARNING</entry> <entry>çalıþma uyarıları (hayati olmayan hatalar)</entry> <entry></entry> </row> <row> <entry>4</entry> <entry>E_PARSE</entry> <entry>derleme sırasında ayrıþtırma hataları</entry> <entry></entry> </row> <row> <entry>8</entry> <entry>E_NOTICE </entry> <entry> çalıþma sırasındaki bildirimler (uyarılardan daha az önemli) </entry> <entry></entry> </row> <row> <entry>16</entry> <entry>E_CORE_ERROR</entry> <entry>PHP'nin iç yapısıyla ilgili, baþlatılmasını engelleyen hayati hatalar</entry> <entry>sadece PHP 4</entry> </row> <row> <entry>32</entry> <entry>E_CORE_WARNING</entry> <entry> PHP'nin iç yapısıyla ilgili, baþlatılması ile ilgili uyarılar (hayati olmayan hatalar) </entry> <entry>sadece PHP 4</entry> </row> <row> <entry>64</entry> <entry>E_COMPILE_ERROR</entry> <entry>hayati derleme hataları</entry> <entry>Sadece PHP 4</entry> </row> <row> <entry>128</entry> <entry>E_COMPILE_WARNING</entry> <entry>derleme sırasındaki uyarılar (hayati olmayan hatalar)</entry> <entry>sadece PHP 4</entry> </row> <row> <entry>256</entry> <entry>E_USER_ERROR</entry> <entry>kullanıcının yarattığı hata mesajı</entry> <entry>sadece PHP 4</entry> </row> <row> <entry>512</entry> <entry>E_USER_WARNING</entry> <entry>kullanıcının yarattığı uyarı mesajı</entry> <entry>sadece PHP 4</entry> </row> <row> <entry>1024</entry> <entry>E_USER_NOTICE </entry> <entry>kullanıcının yarattığı bildiri mesajı</entry> <entry>sadece PHP 4</entry> </row> <row> <entry></entry> <entry>E_ALL</entry> <entry>desteklendiği sürece, yukarıdakilerin hepsi</entry> <entry></entry> </row> </tbody> </tgroup> </table> </para> <para> Yukarıdaki değerler (sayısal veya sembolik) hangi hataların bildirileceğini belirleyen bit maskesini oluþtururken kullanılır. Bu değerleri birleþtirmeyi veya bazılarını maskelemeyi <link linkend="language.operators.bitwise">bit-tabanlı iþlemler</link> ile yapabilirsiniz. <filename>php.ini</filename> içinde sadece '|', '~', '!' ve '&' iþlemlerinin anlaþılacağına, ve <filename>php3.ini</filename> içinde hiçbirinin anlaþılmayacağına dikkat edin. </para> <para> PHP 4'te öntanımlı <link linkend="ini.error-reporting">error_reporting</link> değeri <literal>E_ALL & ~E_NOTICE</literal>'dir ve anlamı E-NOTICE-seviyesi dıþındaki tüm hataların ve uyarıların bildirilmesidir. PHP 3'de öntanımlı ayar <literal>(E_ERROR | E_WARNING | E_PARSE)</literal>'dır ve anlamı öncekiyle aynıdır. Fakat dikkat edin ki, PHP 3'ün <filename>php3.ini</filename> dosyasında sabitler desteklenmediğinden <link linkend="ini.error-reporting">error_reporting</link> ayarı sayısal olmak durumundadır; az önce belirtilen değer de <literal>7</literal>'ye denk gelir. </para> <para> Baþlangıç değeri ini dosyasında <link linkend="ini.error-reporting">error_reporting</link> direktifyle, Apache'nizin <filename>httpd.conf</filename> dosyasında php_error_reporting (PHP 3 için php3_error_reporting) direktifiyle, ve son olarak çalıþma esnasında betik içinden <function>error_reporting</function> fonksiyonuyla belirlenebilir. </para> <warning> <para> Sunucularınızı veya kodlarınızı PHP 3'ten PHP 4'e yükseltirken bu ayarları ve <function>error_reporting</function> fonksiyonu çağrımlarını kontrol etmelisiniz yoksa istemeyerek yeni hata çeþitlerinin bildirimlerini kapatabilirsiniz, özellikle E_COMPILE_ERROR. Bu hatanın ne ve nerede olduğuna dair hiç bir bilgi bırakmadan betiklerinizin tamamiyle boþ sayfalar üretmesine yolaçabilir. </para> </warning> <para> Tüm <link linkend="language.expressions">PHP ifadeler</link> @ ön-ekiyle çağrılabilir. Bu ön-ek, o ifade için hata bildirimini kapatacaktır. Eğer böyle bir ifade sırasında hata oluþursa, ve <link linkend="ini.track-errors">track_errors</link> özelliği aktifse, hata mesajını <literal>$php_errormsg</literal> genel değiþkeninde bulabilirsiniz. </para> <note> <para> <link linkend="language.operators.errorcontrol">@ hata-kontrol iþlemi</link> ön-eki ayrıþtırma hatalarını kapatmayacaktır. </para> </note> <warning> <para> Şu an için <link linkend="language.operators.errorcontrol">@ hata-kontrol iþlemi</link> ön eki betik sonlandırılmasına yol açacak kritik hataların bile gösterilmesini engelleyecektir. Diğer þeylerin dıþında, bu demektir ki <link linkend="language.operators.errorcontrol">@</link> ön-ekini belli fonksiyonlardan gelecek hataları bastırmak için kullanırsanız, ve bu fonksiyonlar tanımlı değilse, betik nedeni belirtilmeden sonlandırılacaktır. </para> </warning> <para> Aþağıda PHP'deki hata kontrolü iþlemlerinin kullanımına iliþkin bir örnek bulacaksınız. Burada bilgileri bir günlükte (XML formatıyla) saklayan ve programcıya kritik hatalarda e-mail yollayan bir hata iþleme fonksiyonu tanımlıyoruz. <example> <title>Betik için hata iþlemenin kullanımı</title> <programlisting role="php"> <![CDATA[ <?php // kendi bildirimimizi kendimiz yapacaðýz error_reporting(0); // kullanýcý tarafýndan belirlenen hata iþleme fonksiyonu function userErrorHandler ($errno, $errmsg, $filename, $linenum, $vars) { // girilen hata için zaman deðeri $dt = date("Y-m-d H:i:s (T)"); // hata dizgileri için bir iliþkili dizi tanýmla // gerçekte ilgilenmemiz gereken deðerler sadece // 2, 8, 256, 512, ve 1024 $errortype = array ( 1 => "Hata", 2 => "Uyarý", 4 => "Ayrýþtýrma Hatasý", 8 => "Bildirim", 16 => "Çekirdek Hatasý", 32 => "Çekirdek Uyarýsý", 64 => "Derleme Hatasý", 128 => "Derleme Uyarýsý", 256 => "Kullanýcý Hatasý", 512 => "Kullanýcý Uyarýsý", 1024=> "Kullanýcý Bildirimi" ); // deðiþken izi kaydedilecek hatalar $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE); $err = "<errorentry>\n"; $err .= "\t<datetime>".$dt."</datetime>\n"; $err .= "\t<errornum>".$errno."</errnumber>\n"; $err .= "\t<errortype>".$errortype[$errno]."</errortype>\n"; $err .= "\t<errormsg>".$errmsg."</errormsg>\n"; $err .= "\t<scriptname>".$filename."</scriptname>\n"; $err .= "\t<scriptlinenum>".$linenum."</scriptlinenum>\n"; if (in_array($errno, $user_errors)) $err .= "\t<vartrace>".wddx_serialize_value($vars,"Variables")."</vartrace>\n"; $err .= "</errorentry>\n\n"; // deneme için // echo $err; // hata günlüðünü kaydet, ve kritik kullanýcý hatalarýnda bana mail yolla error_log($err, 3, "/usr/local/php4/error.log"); if ($errno == E_USER_ERROR) mail("phpdev@mydomain.com","Kritik Kullanýcý Hatasý",$err); } function distance ($vect1, $vect2) { if (!is_array($vect1) || !is_array($vect2)) { trigger_error("Bozuk parametreler, dizi bekleniyordu", E_USER_ERROR); return NULL; } if (count($vect1) != count($vect2)) { trigger_error("Vektörlerin ayný boyutta olmasý gerekiyor", E_USER_ERROR); return NULL; } for ($i=0; $i<count($vect1); $i++) { $c1 = $vect1[$i]; $c2 = $vect2[$i]; $d = 0.0; if (!is_numeric($c1)) { trigger_error("Vektör 1'in $i koordinatý sayý deðil, 0 olarak alýndý", E_USER_WARNING); $c1 = 0.0; } if (!is_numeric($c2)) { trigger_error("Vektör 2'in $i koordinatý sayý deðil, 0 olarak alýndý", E_USER_WARNING); $c2 = 0.0; } $d += $c2*$c2 - $c1*$c1; } return sqrt($d); } $old_error_handler = set_error_handler("userErrorHandler"); // tanýmlanmamýþ sabit, uyarý oluþturur $t = I_AM_NOT_DEFINED; // bazý "vektörler" tanýmla $a = array(2,3,"foo"); $b = array(5.5, 4.3, -1.6); $c = array (1,-3); // kullanýcý hatasý oluþturur $t1 = distance($c,$b)."\n"; // baþka bir kullanýcý hatasý oluþturur $t2 = distance($b,"i am not an array")."\n"; // uyarý oluþturur $t3 = distance($a,$b)."\n"; ?> ]]> </programlisting> </example> Bu <link linkend="ref.errorfunc">Hata İþleme ve Günlük fonksiyonları</link> hakkında basit bir örnek. </para> <para> Ayrıca bkz. <function>error_reporting</function>, <function>error_log</function>, <function>set_error_handler</function>, <function>restore_error_handler</function>, <function>trigger_error</function>, <function>user_error</function> </para> </chapter> <!-- Keep this comment at the end of the file Local variables: mode: sgml sgml-omittag:t sgml-shorttag:t sgml-minimize-attributes:nil sgml-always-quote-attributes:t sgml-indent-step:1 sgml-indent-data:t sgml-parent-document:nil sgml-default-dtd-file:"../../manual.ced" sgml-exposed-tags:nil sgml-local-catalogs:nil sgml-local-ecat-files:nil End: vim600: syn=xml fen fdm=syntax fdl=2 si vim: et tw=78 syn=sgml vi: ts=1 sw=1 --> Index: phpdoc/tr/features/persistent-connections.xml +++ phpdoc/tr/features/persistent-connections.xml <?xml version="1.0" encoding="iso-8859-9"?> <!-- $Revision: 1.1 $ --> <chapter id="features.persistent-connections"> <title>Kalıcı Veritabanı Bağlantıları</title> <simpara> Kalıcı bağlantılar, betiğiniz sonlandığında kapatılmayan SQL bağlantılarına denir. Kalıcı bir bağlantı istendiğinde, PHP daha önceden tamamen aynı özelliklerde başka bir kalıcı bağlantı açılıp açılmadığına bakar (daha önceden kalan) - ve eğer varsa, onu kullanır. Eğer yoksa, yeni bağlantıyı yapar. 'Tamamen aynı' bağlantılar, aynı sunucuya, aynı kullanıcı ismi ve şifreyle (gerekliyse) açılmış bağlantılardır. </simpara> <simpara> HTTP sunucularının çalışma mantığına aşina olmayanlar, kalıcı bağlantıları gerçekte olmadıkları şeyler sanabilirler. Özellikle, aynı SQL bağlantısı üzerinde 'kullanıcı oturumları' <emphasis>açmazlar</emphasis>, transaction'ları daha etkili bir şekilde yapmanızı <emphasis>sağlamazlar</emphasis> ve başka pek çok şeyi gerçekleştirmezler. Konu hakkında daha açık olmak gerekirse, kalıcı bağlantılar size kardeşleri kalıcı olmayan bağlantıların sunmadığı hiç bir ek özellik <emphasis>sunmazlar</emphasis>. </simpara> <simpara> Neden? </simpara> <simpara> Bu daha çok HTTP sunucularının çalışma mantığıyla alakalı. Sunucunun PHP'yi kullanarak web sayfaları oluşturmasının üç yöntemi var. </simpara> <simpara> <!-- dirge: wrapper => sargı --> İlk yöntem PHP'yi CGI "sargısı" olarak kullanmak. Bu şekilde çalıştığında, sunucuya gelen her sayfa isteği için ayrı bir PHP yorumlayıcısı yaratılır ve yokedilir (PHP sayfaları için). İşlemler sonunda yokedildikleri için, yarattıkları her kaynak (SQL sunucusuna bağlantılar gibi) da onlarla birlikte yokolur. Bu durumda, kalıcı bağlantılar kurmayı denemekle elinize hiçbirşey geçmez -- basitçe, kalıcı olamazlar. </simpara> <simpara> İkinci, ve en popüler, yöntem PHP'yi çok işlemli (multiprocess) bir sunucuda modül olarak kullanmak, şu an sadece Apache'de olduğu gibi. Çok işlemli bir sunucu genellikle bir ana işlemden (parent) ve onun kontrolündeki gerçekte işlemleri yapan çocuk işlemlerden (children) oluşur. Ne zaman bir alıcıdan istek gelse, o anda başka bir isteğe cevap vermeyen bir çocuk işleme devredilir. Bu demektir ki, aynı alıcı ikinci bir istek yolladığında, başka bir çocuk işlem tarafından karşılanabilir. Kalıcı bağlantıların sizin için burada yaptığı iş, her çocuk işlemin sadece ilk seferde SQL sunucusuna bağlanması. Başka bir sayfanın aynı bağlantıya duyması durumunda önceden yapılmış bağlantı kullanılır. </simpara> <simpara> <!-- dirge: thread => iş parçacığı --> Son yöntem PHP'yi çok iş parçacıklı (multithreaded) sunucularda eklenti olarak kullanmak. Şu anda PHP 4'ün Netscape FastTrack (iPlanet), Microsoft Internet Information Server (IIS), ve O'Reilly Website Pro gibi çok iş parçacıklı sunucularda çalışmasını sağlayan ISAPI, WSAIP, ve NSAPI (Windows'ta) için desteği var. Bu çalışma şekli az önce anlatılan çok işlemli modelle aynı. SAPI desteğinin PHP 3'te olmadığına dikkat edin. </simpara> <simpara> Eğer kalıcı bağlantıların ek özellikleri yoksa, neye yararlar? </simpara> <simpara> <!-- dige: efficiency => etkinlik --> Buradaki cevap oldukça basit -- etkinlik. Kalıcı bağlantılar, SQL sunucunuza yeni bağlantı açmak performans açısından hesaplı değilse çok işe yararlar. Performans hesaplılığı pek çok şeye bağlıdır. Örneğin, ne tür bir veritabanı olduğu, HTTP sunucusuyla aynı bilgisayarda olup olmayışı, SQL sunucusunun çalıştığı bilgisayarın işlem yoğunluğu ve benzeri. Sonuç şu ki, yeni bağlantı performansı düşükse, kalıcı bağlantılar işe yarar. Her çocuk işlemin her seferinde yeni bağlantı açması yerine hayatı boyunca sadece bir kere bağlantı yapmasını ve sürekli onu kullanmasını sağlarlar. Bu demektir ki, kalıcı bağlantı açan her çocuk işlemin SQL sunucusuna kendine ait kalıcı bir bağlantısı olacaktır. Örneğin, 20 tane kalıcı bağlantı açan betik çalıştırmış farklı çocuk işlem varsa, SQL sunucusuna 20 tane bağlantı olacaktır, her çocuk işlemden bir tane. </simpara> <simpara> Ancak dikkat edin ki, bunun SQL sunucusunun bağlantı limiti kalıcı bağlantılarla aşıldığında bir takım götürüler olacaktır. Eğer veritabanı sunucunuz ayni anda 16 bağlantıya izin veriyorsa, ve yoğun bir çalışma anında 17 çocuk işlem kalıcı bağlantı açmaya kalkarsa, bunlardan biri bağlantıyı açamaz. Eğer betiklerinizde bağlantıların kapanabilmesine olanak tanımayan hatalar varsa (kısır döngü gibi), 32 bağlantıya izin verecek bir veritabanı sunucusu çok çabuk bir şekilde kullanışsız hale gelir. Boş duran (idle) bağlantılarla nasıl ilgileneceğiniz konusunda veritabanınızın dökümanlarına başvurun. </simpara> <warning> <simpara> Kalıcı bağlantı kullanırken akılda tutulması gereken birkaç ek götürü daha var. Örneğin kalıcı bir bağlantıyla bir tablo kitlendiyse (LOCK), ve betik herhangi bir sebepten dolayı kilidi kaldıramıyorsa, ardısıra gelen ve aynı bağlantıyı kullanacak betikler süresiz olarak bloke olacak, ve sizin ya HTTP sunucusunu ya da veritabanı sunucusunu baştan çalıştırmanız gerekecektir. Başka bir götürü transaction kullanırken oluşabilir. Bir transaction bloğu, betiğin çalışma süresi bloğun ömründen kisaysa, bir sonraki betiğe taşınacaktır. İki durumda da <function>register_shutdown_function</function> ile transaction'i geri alacak ya da tablo kilitlerini kaldıracak bir temizlik fonksiyonu kaydedebilirsiniz. Daha iyisi, problemleri tümüyle önlemek için tablo kilitleri veya transaction kullanan betiklerde kalıcı bağlantıları kullanmamak (başka yerlerde hala kullanabilirsiniz). </simpara> </warning> <simpara> Önemli bir özet. Kalıcı bağlantılar normal bağlantılarla birebir eşlenebilecek şekilde tasarlandı. Bu demektir ki <emphasis>her zaman</emphasis> kalıcı bağlantıları normal olanlarla değiştirebilirsiniz, ve bu betiklerin davranışlarını etkilemeyecektir. Betiklerin etkinliklerini <emphasis>belki</emphasis> değiştirebilirler, fakat davranışını değiştirmezler! </simpara> </chapter> <!-- Keep this comment at the end of the file Local variables: mode: sgml sgml-omittag:t sgml-shorttag:t sgml-minimize-attributes:nil sgml-always-quote-attributes:t sgml-indent-step:1 sgml-indent-data:t sgml-parent-document:nil sgml-default-dtd-file:"../../manual.ced" sgml-exposed-tags:nil sgml-local-catalogs:nil sgml-local-ecat-files:nil End: vim600: syn=xml fen fdm=syntax fdl=2 si vim: et tw=78 syn=sgml vi: ts=1 sw=1 --> Index: phpdoc/tr/features/remote-files.xml +++ phpdoc/tr/features/remote-files.xml <?xml version="1.0" encoding="iso-8859-9"?> <!-- $Revision: 1.1 $ --> <chapter id="features.remote-files"> <title>Uzaktaki Dosyaları Kullanmak</title> <para> "URL fopen wrapper" PHP derlenmeden önce aktifleştirildiği (ki, --disable-url-fopen-wrapper parametresini özellikle vermediğinizde böyledir) (4.0.3 öncesi sürümler için) veya php.ini'de <parameter>allow_url_fopen</parameter> ayarına off değerini vermediyseniz (yeni sürümler için) sürece, HTTP ve FTP URL'lerini parametre olarak dosya ismi alan çoğu fonksiyonda, <function>require</function> ve <function>include</function> ifadeleri dahil, kullanabilirsiniz. </para> <para> <note> <para> Uzak dosyaları Windows altında <function>include</function> ve <function>require</function> ifadelerinde kullanamazsınız. </para> </note> </para> <para> Örneğin, bunu uzaktaki bir HTTP sunucusunda olan bir dosyayı açmak, çıktısını ayıklamak ve elde edilen bilgiyi bir veritabanı sorgusunda kullanmak, ya da basitçe web sitenizin geri kalanına uygun bir görüntüde göstermek için kullanabilirsiniz. </para> <para> <example> <title>Uzaktaki bir sayfanın başlığını almak</title> <programlisting role="php"> <![CDATA[ <?php $file = fopen ("http://www.php.net/", "r"); if (!$file) { echo "<p>Uzaktaki dosya açılamadı.\n"; exit; } while (!feof ($file)) { $line = fgets ($file, 1024); /* Bu sadece title etiketi ve içeriği aynı satırdaysa işe yarar */ if (eregi ("<title>(.*)</title>", $line, $out)) { $title = $out[1]; break; } } fclose($file); ?> ]]> </programlisting> </example> </para> <para> Ya da bunu, doğru erişim hakkına sahip bir kullanıcıyla bağlandığınız ve çoktan dosya varolmadığı sürece FTP ile uzaktaki dosyalara yazmak için kullanabilirsiniz. 'anonymous' dışında bir kullanıcı olarak bağlanmak için kullanıcıyı (ve muhtemelen parolayı) URL içine yazmalısınız, örneğin 'ftp://kullanıcı:parola@ftp.example.com/yol/dosya' gibi. (Aynı yöntemi HTTP'de Basic Authentication'a ihtiyaç duyan dosyalara erişmek için de kullanabilirsiniz.) </para> <para> <example> <title>Veriyi uzaktaki sunucuda saklamak</title> <programlisting role="php"> <![CDATA[ <?php $file = fopen ("ftp://ftp.php.net/incoming/outputfile", "w"); if (!$file) { echo "<p>Yazmak üzere uzak dosya açılamadı\n"; exit; } /* Veriyi yaz */ fputs ($file, "$HTTP_USER_AGENT\n"); fclose ($file); ?> ]]> </programlisting> </example> </para> <para> <note> <para> Yukarıdaki örnekten, uzaktaki bir günlüğe yazmak için nasıl bir teknik kullanacağınız konusunda bir fikir almışsınızdır, fakat önceden belirtildiği gibi, URL fopen() sargılarıyla sadece yeni dosyalara yazabilirsiniz. Bunun gibi dağıtılmış günlük tutmak isterseniz, <function>syslog</function>'s bir göz atmalısınız. </para> </note> </para> </chapter> <!-- Keep this comment at the end of the file Local variables: mode: sgml sgml-omittag:t sgml-shorttag:t sgml-minimize-attributes:nil sgml-always-quote-attributes:t sgml-indent-step:1 sgml-indent-data:t sgml-parent-document:nil sgml-default-dtd-file:"../../manual.ced" sgml-exposed-tags:nil sgml-local-catalogs:nil sgml-local-ecat-files:nil End: vim600: syn=xml fen fdm=syntax fdl=2 si vim: et tw=78 syn=sgml vi: ts=1 sw=1 -->
Index: phpdoc/tr/features/error-handling.xml +++ phpdoc/tr/features/error-handling.xml <?xml version="1.0" encoding="iso-8859-1"?> <!-- $Revision: 1.1 $ --> <chapter id="features.error-handling"> <title>Hata İþlemleri</title> <para> PHP'de pek çok uyarı çeþidi vardır. Bunlar: <table> <title>PHP uyarı çeþitleri</title> <tgroup cols="4"> <thead> <row> <entry>Değer</entry> <entry>Sabit</entry> <entry>Tanım</entry> <entry>Not</entry> </row> </thead> <tbody> <row> <entry>1</entry> <entry>E_ERROR</entry> <entry>hayati çalıþma hataları</entry> <entry></entry> </row> <row> <entry>2</entry> <entry>E_WARNING</entry> <entry>çalıþma uyarıları (hayati olmayan hatalar)</entry> <entry></entry> </row> <row> <entry>4</entry> <entry>E_PARSE</entry> <entry>derleme sırasında ayrıþtırma hataları</entry> <entry></entry> </row> <row> <entry>8</entry> <entry>E_NOTICE </entry> <entry> çalıþma sırasındaki bildirimler (uyarılardan daha az önemli) </entry> <entry></entry> </row> <row> <entry>16</entry> <entry>E_CORE_ERROR</entry> <entry>PHP'nin iç yapısıyla ilgili, baþlatılmasını engelleyen hayati hatalar</entry> <entry>sadece PHP 4</entry> </row> <row> <entry>32</entry> <entry>E_CORE_WARNING</entry> <entry> PHP'nin iç yapısıyla ilgili, baþlatılması ile ilgili uyarılar (hayati olmayan hatalar) </entry> <entry>sadece PHP 4</entry> </row> <row> <entry>64</entry> <entry>E_COMPILE_ERROR</entry> <entry>hayati derleme hataları</entry> <entry>Sadece PHP 4</entry> </row> <row> <entry>128</entry> <entry>E_COMPILE_WARNING</entry> <entry>derleme sırasındaki uyarılar (hayati olmayan hatalar)</entry> <entry>sadece PHP 4</entry> </row> <row> <entry>256</entry> <entry>E_USER_ERROR</entry> <entry>kullanıcının yarattığı hata mesajı</entry> <entry>sadece PHP 4</entry> </row> <row> <entry>512</entry> <entry>E_USER_WARNING</entry> <entry>kullanıcının yarattığı uyarı mesajı</entry> <entry>sadece PHP 4</entry> </row> <row> <entry>1024</entry> <entry>E_USER_NOTICE </entry> <entry>kullanıcının yarattığı bildiri mesajı</entry> <entry>sadece PHP 4</entry> </row> <row> <entry></entry> <entry>E_ALL</entry> <entry>desteklendiği sürece, yukarıdakilerin hepsi</entry> <entry></entry> </row> </tbody> </tgroup> </table> </para> <para> Yukarıdaki değerler (sayısal veya sembolik) hangi hataların bildirileceğini belirleyen bit maskesini oluþtururken kullanılır. Bu değerleri birleþtirmeyi veya bazılarını maskelemeyi <link linkend="language.operators.bitwise">bit-tabanlı iþlemler</link> ile yapabilirsiniz. <filename>php.ini</filename> içinde sadece '|', '~', '!' ve '&' iþlemlerinin anlaþılacağına, ve <filename>php3.ini</filename> içinde hiçbirinin anlaþılmayacağına dikkat edin. </para> <para> PHP 4'te öntanımlı <link linkend="ini.error-reporting">error_reporting</link> değeri <literal>E_ALL & ~E_NOTICE</literal>'dir ve anlamı E-NOTICE-seviyesi dıþındaki tüm hataların ve uyarıların bildirilmesidir. PHP 3'de öntanımlı ayar <literal>(E_ERROR | E_WARNING | E_PARSE)</literal>'dır ve anlamı öncekiyle aynıdır. Fakat dikkat edin ki, PHP 3'ün <filename>php3.ini</filename> dosyasında sabitler desteklenmediğinden <link linkend="ini.error-reporting">error_reporting</link> ayarı sayısal olmak durumundadır; az önce belirtilen değer de <literal>7</literal>'ye denk gelir. </para> <para> Baþlangıç değeri ini dosyasında <link linkend="ini.error-reporting">error_reporting</link> direktifyle, Apache'nizin <filename>httpd.conf</filename> dosyasında php_error_reporting (PHP 3 için php3_error_reporting) direktifiyle, ve son olarak çalıþma esnasında betik içinden <function>error_reporting</function> fonksiyonuyla belirlenebilir. </para> <warning> <para> Sunucularınızı veya kodlarınızı PHP 3'ten PHP 4'e yükseltirken bu ayarları ve <function>error_reporting</function> fonksiyonu çağrımlarını kontrol etmelisiniz yoksa istemeyerek yeni hata çeþitlerinin bildirimlerini kapatabilirsiniz, özellikle E_COMPILE_ERROR. Bu hatanın ne ve nerede olduğuna dair hiç bir bilgi bırakmadan betiklerinizin tamamiyle boþ sayfalar üretmesine yolaçabilir. </para> </warning> <para> Tüm <link linkend="language.expressions">PHP ifadeler</link> @ ön-ekiyle çağrılabilir. Bu ön-ek, o ifade için hata bildirimini kapatacaktır. Eğer böyle bir ifade sırasında hata oluþursa, ve <link linkend="ini.track-errors">track_errors</link> özelliği aktifse, hata mesajını <literal>$php_errormsg</literal> genel değiþkeninde bulabilirsiniz. </para> <note> <para> <link linkend="language.operators.errorcontrol">@ hata-kontrol iþlemi</link> ön-eki ayrıþtırma hatalarını kapatmayacaktır. </para> </note> <warning> <para> Şu an için <link linkend="language.operators.errorcontrol">@ hata-kontrol iþlemi</link> ön eki betik sonlandırılmasına yol açacak kritik hataların bile gösterilmesini engelleyecektir. Diğer þeylerin dıþında, bu demektir ki <link linkend="language.operators.errorcontrol">@</link> ön-ekini belli fonksiyonlardan gelecek hataları bastırmak için kullanırsanız, ve bu fonksiyonlar tanımlı değilse, betik nedeni belirtilmeden sonlandırılacaktır. </para> </warning> <para> Aþağıda PHP'deki hata kontrolü iþlemlerinin kullanımına iliþkin bir örnek bulacaksınız. Burada bilgileri bir günlükte (XML formatıyla) saklayan ve programcıya kritik hatalarda e-mail yollayan bir hata iþleme fonksiyonu tanımlıyoruz. <example> <title>Betik için hata iþlemenin kullanımı</title> <programlisting role="php"> <![CDATA[ <?php // kendi bildirimimizi kendimiz yapacaðýz error_reporting(0); // kullanýcý tarafýndan belirlenen hata iþleme fonksiyonu function userErrorHandler ($errno, $errmsg, $filename, $linenum, $vars) { // girilen hata için zaman deðeri $dt = date("Y-m-d H:i:s (T)"); // hata dizgileri için bir iliþkili dizi tanýmla // gerçekte ilgilenmemiz gereken deðerler sadece // 2, 8, 256, 512, ve 1024 $errortype = array ( 1 => "Hata", 2 => "Uyarý", 4 => "Ayrýþtýrma Hatasý", 8 => "Bildirim", 16 => "Çekirdek Hatasý", 32 => "Çekirdek Uyarýsý", 64 => "Derleme Hatasý", 128 => "Derleme Uyarýsý", 256 => "Kullanýcý Hatasý", 512 => "Kullanýcý Uyarýsý", 1024=> "Kullanýcý Bildirimi" ); // deðiþken izi kaydedilecek hatalar $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE); $err = "<errorentry>\n"; $err .= "\t<datetime>".$dt."</datetime>\n"; $err .= "\t<errornum>".$errno."</errnumber>\n"; $err .= "\t<errortype>".$errortype[$errno]."</errortype>\n"; $err .= "\t<errormsg>".$errmsg."</errormsg>\n"; $err .= "\t<scriptname>".$filename."</scriptname>\n"; $err .= "\t<scriptlinenum>".$linenum."</scriptlinenum>\n"; if (in_array($errno, $user_errors)) $err .= "\t<vartrace>".wddx_serialize_value($vars,"Variables")."</vartrace>\n"; $err .= "</errorentry>\n\n"; // deneme için // echo $err; // hata günlüðünü kaydet, ve kritik kullanýcý hatalarýnda bana mail yolla error_log($err, 3, "/usr/local/php4/error.log"); if ($errno == E_USER_ERROR) mail("phpdev@mydomain.com","Kritik Kullanýcý Hatasý",$err); } function distance ($vect1, $vect2) { if (!is_array($vect1) || !is_array($vect2)) { trigger_error("Bozuk parametreler, dizi bekleniyordu", E_USER_ERROR); return NULL; } if (count($vect1) != count($vect2)) { trigger_error("Vektörlerin ayný boyutta olmasý gerekiyor", E_USER_ERROR); return NULL; } for ($i=0; $i<count($vect1); $i++) { $c1 = $vect1[$i]; $c2 = $vect2[$i]; $d = 0.0; if (!is_numeric($c1)) { trigger_error("Vektör 1'in $i koordinatý sayý deðil, 0 olarak alýndý", E_USER_WARNING); $c1 = 0.0; } if (!is_numeric($c2)) { trigger_error("Vektör 2'in $i koordinatý sayý deðil, 0 olarak alýndý", E_USER_WARNING); $c2 = 0.0; } $d += $c2*$c2 - $c1*$c1; } return sqrt($d); } $old_error_handler = set_error_handler("userErrorHandler"); // tanýmlanmamýþ sabit, uyarý oluþturur $t = I_AM_NOT_DEFINED; // bazý "vektörler" tanýmla $a = array(2,3,"foo"); $b = array(5.5, 4.3, -1.6); $c = array (1,-3); // kullanýcý hatasý oluþturur $t1 = distance($c,$b)."\n"; // baþka bir kullanýcý hatasý oluþturur $t2 = distance($b,"i am not an array")."\n"; // uyarý oluþturur $t3 = distance($a,$b)."\n"; ?> ]]> </programlisting> </example> Bu <link linkend="ref.errorfunc">Hata İþleme ve Günlük fonksiyonları</link> hakkında basit bir örnek. </para> <para> Ayrıca bkz. <function>error_reporting</function>, <function>error_log</function>, <function>set_error_handler</function>, <function>restore_error_handler</function>, <function>trigger_error</function>, <function>user_error</function> </para> </chapter> <!-- Keep this comment at the end of the file Local variables: mode: sgml sgml-omittag:t sgml-shorttag:t sgml-minimize-attributes:nil sgml-always-quote-attributes:t sgml-indent-step:1 sgml-indent-data:t sgml-parent-document:nil sgml-default-dtd-file:"../../manual.ced" sgml-exposed-tags:nil sgml-local-catalogs:nil sgml-local-ecat-files:nil End: vim600: syn=xml fen fdm=syntax fdl=2 si vim: et tw=78 syn=sgml vi: ts=1 sw=1 --> Index: phpdoc/tr/features/persistent-connections.xml +++ phpdoc/tr/features/persistent-connections.xml <?xml version="1.0" encoding="iso-8859-9"?> <!-- $Revision: 1.1 $ --> <chapter id="features.persistent-connections"> <title>Kalıcı Veritabanı Bağlantıları</title> <simpara> Kalıcı bağlantılar, betiğiniz sonlandığında kapatılmayan SQL bağlantılarına denir. Kalıcı bir bağlantı istendiğinde, PHP daha önceden tamamen aynı özelliklerde başka bir kalıcı bağlantı açılıp açılmadığına bakar (daha önceden kalan) - ve eğer varsa, onu kullanır. Eğer yoksa, yeni bağlantıyı yapar. 'Tamamen aynı' bağlantılar, aynı sunucuya, aynı kullanıcı ismi ve şifreyle (gerekliyse) açılmış bağlantılardır. </simpara> <simpara> HTTP sunucularının çalışma mantığına aşina olmayanlar, kalıcı bağlantıları gerçekte olmadıkları şeyler sanabilirler. Özellikle, aynı SQL bağlantısı üzerinde 'kullanıcı oturumları' <emphasis>açmazlar</emphasis>, transaction'ları daha etkili bir şekilde yapmanızı <emphasis>sağlamazlar</emphasis> ve başka pek çok şeyi gerçekleştirmezler. Konu hakkında daha açık olmak gerekirse, kalıcı bağlantılar size kardeşleri kalıcı olmayan bağlantıların sunmadığı hiç bir ek özellik <emphasis>sunmazlar</emphasis>. </simpara> <simpara> Neden? </simpara> <simpara> Bu daha çok HTTP sunucularının çalışma mantığıyla alakalı. Sunucunun PHP'yi kullanarak web sayfaları oluşturmasının üç yöntemi var. </simpara> <simpara> <!-- dirge: wrapper => sargı --> İlk yöntem PHP'yi CGI "sargısı" olarak kullanmak. Bu şekilde çalıştığında, sunucuya gelen her sayfa isteği için ayrı bir PHP yorumlayıcısı yaratılır ve yokedilir (PHP sayfaları için). İşlemler sonunda yokedildikleri için, yarattıkları her kaynak (SQL sunucusuna bağlantılar gibi) da onlarla birlikte yokolur. Bu durumda, kalıcı bağlantılar kurmayı denemekle elinize hiçbirşey geçmez -- basitçe, kalıcı olamazlar. </simpara> <simpara> İkinci, ve en popüler, yöntem PHP'yi çok işlemli (multiprocess) bir sunucuda modül olarak kullanmak, şu an sadece Apache'de olduğu gibi. Çok işlemli bir sunucu genellikle bir ana işlemden (parent) ve onun kontrolündeki gerçekte işlemleri yapan çocuk işlemlerden (children) oluşur. Ne zaman bir alıcıdan istek gelse, o anda başka bir isteğe cevap vermeyen bir çocuk işleme devredilir. Bu demektir ki, aynı alıcı ikinci bir istek yolladığında, başka bir çocuk işlem tarafından karşılanabilir. Kalıcı bağlantıların sizin için burada yaptığı iş, her çocuk işlemin sadece ilk seferde SQL sunucusuna bağlanması. Başka bir sayfanın aynı bağlantıya duyması durumunda önceden yapılmış bağlantı kullanılır. </simpara> <simpara> <!-- dirge: thread => iş parçacığı --> Son yöntem PHP'yi çok iş parçacıklı (multithreaded) sunucularda eklenti olarak kullanmak. Şu anda PHP 4'ün Netscape FastTrack (iPlanet), Microsoft Internet Information Server (IIS), ve O'Reilly Website Pro gibi çok iş parçacıklı sunucularda çalışmasını sağlayan ISAPI, WSAIP, ve NSAPI (Windows'ta) için desteği var. Bu çalışma şekli az önce anlatılan çok işlemli modelle aynı. SAPI desteğinin PHP 3'te olmadığına dikkat edin. </simpara> <simpara> Eğer kalıcı bağlantıların ek özellikleri yoksa, neye yararlar? </simpara> <simpara> <!-- dige: efficiency => etkinlik --> Buradaki cevap oldukça basit -- etkinlik. Kalıcı bağlantılar, SQL sunucunuza yeni bağlantı açmak performans açısından hesaplı değilse çok işe yararlar. Performans hesaplılığı pek çok şeye bağlıdır. Örneğin, ne tür bir veritabanı olduğu, HTTP sunucusuyla aynı bilgisayarda olup olmayışı, SQL sunucusunun çalıştığı bilgisayarın işlem yoğunluğu ve benzeri. Sonuç şu ki, yeni bağlantı performansı düşükse, kalıcı bağlantılar işe yarar. Her çocuk işlemin her seferinde yeni bağlantı açması yerine hayatı boyunca sadece bir kere bağlantı yapmasını ve sürekli onu kullanmasını sağlarlar. Bu demektir ki, kalıcı bağlantı açan her çocuk işlemin SQL sunucusuna kendine ait kalıcı bir bağlantısı olacaktır. Örneğin, 20 tane kalıcı bağlantı açan betik çalıştırmış farklı çocuk işlem varsa, SQL sunucusuna 20 tane bağlantı olacaktır, her çocuk işlemden bir tane. </simpara> <simpara> Ancak dikkat edin ki, bunun SQL sunucusunun bağlantı limiti kalıcı bağlantılarla aşıldığında bir takım götürüler olacaktır. Eğer veritabanı sunucunuz ayni anda 16 bağlantıya izin veriyorsa, ve yoğun bir çalışma anında 17 çocuk işlem kalıcı bağlantı açmaya kalkarsa, bunlardan biri bağlantıyı açamaz. Eğer betiklerinizde bağlantıların kapanabilmesine olanak tanımayan hatalar varsa (kısır döngü gibi), 32 bağlantıya izin verecek bir veritabanı sunucusu çok çabuk bir şekilde kullanışsız hale gelir. Boş duran (idle) bağlantılarla nasıl ilgileneceğiniz konusunda veritabanınızın dökümanlarına başvurun. </simpara> <warning> <simpara> Kalıcı bağlantı kullanırken akılda tutulması gereken birkaç ek götürü daha var. Örneğin kalıcı bir bağlantıyla bir tablo kitlendiyse (LOCK), ve betik herhangi bir sebepten dolayı kilidi kaldıramıyorsa, ardısıra gelen ve aynı bağlantıyı kullanacak betikler süresiz olarak bloke olacak, ve sizin ya HTTP sunucusunu ya da veritabanı sunucusunu baştan çalıştırmanız gerekecektir. Başka bir götürü transaction kullanırken oluşabilir. Bir transaction bloğu, betiğin çalışma süresi bloğun ömründen kisaysa, bir sonraki betiğe taşınacaktır. İki durumda da <function>register_shutdown_function</function> ile transaction'i geri alacak ya da tablo kilitlerini kaldıracak bir temizlik fonksiyonu kaydedebilirsiniz. Daha iyisi, problemleri tümüyle önlemek için tablo kilitleri veya transaction kullanan betiklerde kalıcı bağlantıları kullanmamak (başka yerlerde hala kullanabilirsiniz). </simpara> </warning> <simpara> Önemli bir özet. Kalıcı bağlantılar normal bağlantılarla birebir eşlenebilecek şekilde tasarlandı. Bu demektir ki <emphasis>her zaman</emphasis> kalıcı bağlantıları normal olanlarla değiştirebilirsiniz, ve bu betiklerin davranışlarını etkilemeyecektir. Betiklerin etkinliklerini <emphasis>belki</emphasis> değiştirebilirler, fakat davranışını değiştirmezler! </simpara> </chapter> <!-- Keep this comment at the end of the file Local variables: mode: sgml sgml-omittag:t sgml-shorttag:t sgml-minimize-attributes:nil sgml-always-quote-attributes:t sgml-indent-step:1 sgml-indent-data:t sgml-parent-document:nil sgml-default-dtd-file:"../../manual.ced" sgml-exposed-tags:nil sgml-local-catalogs:nil sgml-local-ecat-files:nil End: vim600: syn=xml fen fdm=syntax fdl=2 si vim: et tw=78 syn=sgml vi: ts=1 sw=1 --> Index: phpdoc/tr/features/remote-files.xml +++ phpdoc/tr/features/remote-files.xml <?xml version="1.0" encoding="iso-8859-9"?> <!-- $Revision: 1.1 $ --> <chapter id="features.remote-files"> <title>Uzaktaki Dosyaları Kullanmak</title> <para> "URL fopen wrapper" PHP derlenmeden önce aktifleştirildiği (ki, --disable-url-fopen-wrapper parametresini özellikle vermediğinizde böyledir) (4.0.3 öncesi sürümler için) veya php.ini'de <parameter>allow_url_fopen</parameter> ayarına off değerini vermediyseniz (yeni sürümler için) sürece, HTTP ve FTP URL'lerini parametre olarak dosya ismi alan çoğu fonksiyonda, <function>require</function> ve <function>include</function> ifadeleri dahil, kullanabilirsiniz. </para> <para> <note> <para> Uzak dosyaları Windows altında <function>include</function> ve <function>require</function> ifadelerinde kullanamazsınız. </para> </note> </para> <para> Örneğin, bunu uzaktaki bir HTTP sunucusunda olan bir dosyayı açmak, çıktısını ayıklamak ve elde edilen bilgiyi bir veritabanı sorgusunda kullanmak, ya da basitçe web sitenizin geri kalanına uygun bir görüntüde göstermek için kullanabilirsiniz. </para> <para> <example> <title>Uzaktaki bir sayfanın başlığını almak</title> <programlisting role="php"> <![CDATA[ <?php $file = fopen ("http://www.php.net/", "r"); if (!$file) { echo "<p>Uzaktaki dosya açılamadı.\n"; exit; } while (!feof ($file)) { $line = fgets ($file, 1024); /* Bu sadece title etiketi ve içeriği aynı satırdaysa işe yarar */ if (eregi ("<title>(.*)</title>", $line, $out)) { $title = $out[1]; break; } } fclose($file); ?> ]]> </programlisting> </example> </para> <para> Ya da bunu, doğru erişim hakkına sahip bir kullanıcıyla bağlandığınız ve çoktan dosya varolmadığı sürece FTP ile uzaktaki dosyalara yazmak için kullanabilirsiniz. 'anonymous' dışında bir kullanıcı olarak bağlanmak için kullanıcıyı (ve muhtemelen parolayı) URL içine yazmalısınız, örneğin 'ftp://kullanıcı:parola@ftp.example.com/yol/dosya' gibi. (Aynı yöntemi HTTP'de Basic Authentication'a ihtiyaç duyan dosyalara erişmek için de kullanabilirsiniz.) </para> <para> <example> <title>Veriyi uzaktaki sunucuda saklamak</title> <programlisting role="php"> <![CDATA[ <?php $file = fopen ("ftp://ftp.php.net/incoming/outputfile", "w"); if (!$file) { echo "<p>Yazmak üzere uzak dosya açılamadı\n"; exit; } /* Veriyi yaz */ fputs ($file, "$HTTP_USER_AGENT\n"); fclose ($file); ?> ]]> </programlisting> </example> </para> <para> <note> <para> Yukarıdaki örnekten, uzaktaki bir günlüğe yazmak için nasıl bir teknik kullanacağınız konusunda bir fikir almışsınızdır, fakat önceden belirtildiği gibi, URL fopen() sargılarıyla sadece yeni dosyalara yazabilirsiniz. Bunun gibi dağıtılmış günlük tutmak isterseniz, <function>syslog</function>'s bir göz atmalısınız. </para> </note> </para> </chapter> <!-- Keep this comment at the end of the file Local variables: mode: sgml sgml-omittag:t sgml-shorttag:t sgml-minimize-attributes:nil sgml-always-quote-attributes:t sgml-indent-step:1 sgml-indent-data:t sgml-parent-document:nil sgml-default-dtd-file:"../../manual.ced" sgml-exposed-tags:nil sgml-local-catalogs:nil sgml-local-ecat-files:nil End: vim600: syn=xml fen fdm=syntax fdl=2 si vim: et tw=78 syn=sgml vi: ts=1 sw=1 -->