Kurulum

Bu bölüm, kurulum sırasında sık rastlanan sorunlarla ilgili sorular ve çözümlerden derlenmiştir. PHP hemen hemen tüm işletim sistemlerine kurulabilmekte ve hemen her HTTP sunucusu ile çalışabilmektedir.

PHP'yi kurmak için Yapılandırma ve Kurulum bölümündeki talimatları izleyin.

  1. Apache 2'yi çok evreli bir MPM ile üretim ortamında neden kullanmamalıyım?
  2. Unix/Windows: php.ini dosyamın yerini bulamıyorum!
  3. Unix: PHP'yi kurdum, fakat her belge yükleyişimde 'Document Contains No Data'! (Belge hiç veri içermiyor!) şeklinde bir ileti alıyorum. Ne yapmalıyım?
  4. Unix: PHP'yi RPM'leri kullanarak kurdum, fakat Apache, PHP sayfalarını işlemiyor! Ne yapmalıyım?
  5. Unix: Apache'yi FrontPage eklenti yamasıyla yamadım ve hemen ardından PHP çalışmaz hale geldi. PHP, Apache FrontPage eklentileriyle uyumlu değil mi?
  6. Unix/Windows: PHP'yi kurdum, fakat PHP betiğine tarayıcımla erişmeye çalıştığımda boş bir sayfa alıyorum.
  7. Unix/Windows: PHP'yi kurdum, fakat PHP betiğine tarayıcımla erişmeye çalıştığımda sunucudan 500 hatası alıyorum.
  8. Bazı işletim sistemleri: PHP'yi hatasız kurdum fakat Apache'yi başlatmak istediğimde tanımsız simge hataları aldım: [mybox:user /src/php5] root# apachectl configtest apachectl: /usr/local/apache/bin/httpd Undefined symbols: _compress _uncompress
  9. Windows: PHP'yi kurdum fakat tarayıcımla bir PHP betiğine erişmek istediğimde şöyle bir hata alıyorum: cgi error: The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:
  10. Windows: Tüm talimatları izlememe rağmen PHP ile IIS'yi birlikte çalıştıramadım!
  11. PHP'yi IIS, PWS, OmniHTTPD veya Xitami ile CGI olarak çalıştırırken şu hatayı alıyorum: Security Alert! PHP CGI cannot be accessed directly..
  12. Hangi php.ini dosyasının okunduğunu nasıl anlayacağım? Yaptığım değişikliklerin bir etkisi olmuyor gibi gözüküyor.
  13. PHP dizinimi Windows'ta PATH değişkenine nasıl eklerim?
  14. Windows üzerinde PHP'nin php.ini dosyasını kullanabilmesini nasıl sağlarım?
  15. PHP ile Apache içerik dili uzlaşımını kullanmak (MultiViews seçeneği) mümkün mü?
  16. PHP'nin GET ve POST istekleri dışında istekleri işleme sokmaması sağlanabilir mi?
Apache 2'yi çok evreli bir MPM ile üretim ortamında neden kullanmamalıyım?

PHP üçüncü parti kütüphaneler kullanılarak muhtelif HTTP uygulamaları geliştirmeyi sağlayan bir yapıştırıcıdır. PHP'nin esnekliği ve gücü üzerinde çalıştığı platformun gücü ve kararlılığı ile sınırlıdır. Çalışmak için bir işletim sistemine, HTTP sunucusuna ve 3. parti modüllere ihtiyaç duyar ve bunlar arasında bir yapıştırıcı gibi davranır. Bunlardan biri çalışmasını durdurursa sorunu saptayıp çabucak çözümlemeniz gerekir. PHP'nin üzerinde çalıştığı ortamı, birbirlerinden bağımsız çalışma evreleri, tamamen ayrı bellek bölümleri ve her istek için ayrı bir çalışma alanı ile daha da karmaşıklaştırırsanız, PHP'nin hamuru bir bulamaca dönüşebilir.

Çok evreli bir MPM kullanmak isterseniz, PHP'nin kendi bellek uzayında çalışmasını sağlayan FastCGI yapılandırması bir çözüm olabilir.

Unix/Windows: php.ini dosyamın yerini bulamıyorum!

Öntanımlı olarak Unix üzerindeki yeri /usr/local/lib dizinidir. Çoğu kişi bu dosyanın yerini derleme sırasında --with-config-file-path seçeneğini kullanarak değiştirmektedir. Siz de isterseniz dosyanın yerini şöyle değiştirebilirsiniz:

--with-config-file-path=/etc
Böylece kaynak paketindeki php.ini-development dosyası /etc/php.ini olarak kurulur ve üzerinde istediğiniz değişiklikleri yapabilirsiniz.

--with-config-file-scan-dir=YOL

Windows'ta php.ini dosyasının öntanımlı yeri Windows dizinidir. Apache HTTP sunucusu kullanıyorsanız php.ini önce Apache'nin kurulum dizininde aranır (örn, c:\program files\apache group\apache). Bu yer aynı makinede çalışan farklı Apache sürümleri için farklı yerlerde olabilir.

Ayrıca bakınız: Yapılandırma Dosyası.

Unix: PHP'yi kurdum, fakat her belge yükleyişimde 'Document Contains No Data'! (Belge hiç veri içermiyor!) şeklinde bir ileti alıyorum. Ne yapmalıyım?

Muhtemelen PHP'nin bazı sorunları var ve core dosyası dökümlüyor olmalı. Bu durumda, sunucunuzun günlük kayıt dosyalarına bakıp sorunu küçük bir deney ortamında üretmeye çalışın. 'gdb' kullanmayı biliyorsanız, hata raporunuzda sorun hakkında geliştiricilere çok yardımcı olacak bir hata izleme çıktısı sağlayabilirsiniz. PHP'yi bir Apache modülü olarak kullanıyorsanız şunları yapmayı deneyin:

  • httpd sürecini durdurun

  • gdb httpd

  • httpd süreçlerini durdurun

  • > run -X -f /bir/yol/httpd.conf

  • Ardından soruna sebep olan adresi tarayıcınızla açın.

  • > run -X -f /bir/yol/httpd.conf

  • Bir core dosyası dökümleniyorsa gdb size bunun sebebini söyleyecektir.

  • Şunu yazın: bt

  • Hata raporunuza bu geriye doğru hata izleme bilgisini eklemeli ve raporu » https://bugs.php.net/ adresinden göndermelisiniz.

Eğer betiğinizde düzenli ifade işlevlerini (preg_match() ve benzerleri) kullanıyorsanız, PHP'yi ve Apache'yi aynı düzenli ifade paketiyle derlediğinizden emin olmalısınız. PHP ve Apache 1.3.x için bu özdevinimli olarak gerçekleşir.

Unix: PHP'yi RPM'leri kullanarak kurdum, fakat Apache, PHP sayfalarını işlemiyor! Ne yapmalıyım?

Hem Apache hem de PHP'yi RPM paketlerinden kurduğunuz varsayımıyla httpd.conf dosyanıza aşağıdaki satırların tamamını veya bir kısmını ekleyin veya başlarındaki # imlerini silip o satırları etkin kılın:

# Ek Modüller
AddModule mod_php.c
AddModule mod_perl.c

# Ek Modüller
LoadModule php_module         modules/mod_php.so
LoadModule php5_module        modules/libphp5.so
LoadModule perl_module        modules/libperl.so
Ve sunucu genelinde geçerli olacak şekilde veya PHP'nin etkin olacağı sanal konak bölümünde şu satırı ekleyin:
AddType application/x-httpd-php .php

Unix: Apache'yi FrontPage eklenti yamasıyla yamadım ve hemen ardından PHP çalışmaz hale geldi. PHP, Apache FrontPage eklentileriyle uyumlu değil mi?

PHP, FrontPage eklentileriyle gayet güzel çalışır. Sorun, FrontPage yamasının PHP'nin de çalıştığı veri yapılarını değiştirmesidir. FP yamasını uyguladıktan sonra PHP'yi yeniden derleyerek (make clean; make) sorunu çözebilirsiniz.

Unix/Windows: PHP'yi kurdum, fakat PHP betiğine tarayıcımla erişmeye çalıştığımda boş bir sayfa alıyorum.

Tarayıcınıza 'Sayfa kaynağını göster' derseniz PHP betiğinizin kaynak koduna bakarak sorunun kaynağını bulabilirsiniz. Yani, HTTP sunucusu betiği yorumlasın diye PHP'ye göndermemiştir. Sunucu yapılandırmasında birşeyler yanlış gitmiş olabilir. PHP kurulum talimatlarını tekrar uygulayarak sunucu kurulumunuzu tekrar gözden geçirin.

Unix/Windows: PHP'yi kurdum, fakat PHP betiğine tarayıcımla erişmeye çalıştığımda sunucudan 500 hatası alıyorum.

Sunucu PHP'yi çalıştırmaya uğraşırken birşeyler yanlış gitmiş. Hataları görmek için komut satırından PHP çalıştırılabilirinin (Windows'ta php.exe) bulunduğu dizine geçip php -i komutunu verin. Eğer PHP çalışırken bir sorun ortaya çıkıyorsa ne yapılması gerektiği ile ilgili ipuçları içeren bir hata iletisi gösterilir. Eğer ekranı dolduran bir dolu HTML kodu alıyorsanız (bu, phpinfo() işlevinin çıktısıdır) PHP düzgün çalışıyor demektir. Bu durumda sunucu yapılandırmanızı tekrar gözden geçirmeniz gerekir.

Bazı işletim sistemleri: PHP'yi hatasız kurdum fakat Apache'yi başlatmak istediğimde tanımsız simge hataları aldım:
[mybox:user /src/php5] root# apachectl configtest
 apachectl: /usr/local/apache/bin/httpd Undefined symbols:
  _compress
  _uncompress

Bu sorun PHP'nin kendisi ile değil, MySQL istemci kütüphanesi ile ilgilidir. Derleme sırasında --with-zlib seçeneğini kullansaydınız bu sorun çıkmayacaktı. Bu konudan MySQL SSS'sinde de bahsedilmiştir.

Windows: PHP'yi kurdum fakat tarayıcımla bir PHP betiğine erişmek istediğimde şöyle bir hata alıyorum:
cgi error:
 The specified CGI application misbehaved by not
 returning a complete set of HTTP headers.
 The headers it did return are:

Hata iletisi PHP'nin hiçbir şey çıktılamadan başarısız olduğu anlamına gelmektedir. Hataları görmek için komut satırından PHP çalıştırılabilirinin (Windows'ta php.exe) bulunduğu dizine geçip php -i komutunu verin. Eğer PHP çalışırken bir sorun ortaya çıkıyorsa ne yapılması gerektiği ile ilgili ipuçları içeren bir hata iletisi gösterilir. Eğer ekranı dolduran bir dolu HTML kodu alıyorsanız (bu, phpinfo() işlevinin çıktısıdır) PHP düzgün çalışıyor demektir.

PHP komut satırından düzgün çalışıyorsa betiğe tarayıcınızla tekrar erişmeyi deneyin. Yine aynı hatayı alıyorsanız sorun şunlardan biri olabilir:

  • Yüklemeye çalıştığınız PHP betiği, php.exe, php5ts.dll, php.ini veya PHP eklentileri gibi bazı dosyaların izinleri anonim internet kullanıcısının ISUR_<makineadı> bunlara erişebilmesine izin vermiyordur.
  • Betik dosyası mevcut değildir (veya belge kök dizinine göre sizin düşündüğünüz yerde değildir). IIS kullanıyorsanız, İnternet Hizmetleri Yöneticisinde betik eşlemlerini ayarlarken 'dosya mevcut mu diye bir bakıver' kutusunu işaretlemek suretiyle bu hatayı yakalayabilirsiniz. Betik dosyasının mevcut olmaması durumunda sunucu bu hata yerine bir 404 hatası döndürecektir. IIS kullanmanın size ek bir yararı daha olacak: Betik dosyanız üzerinde NTLanMan izinlerine dayalı olarak gerekli kimlik doğrulaması da yapılacaktır.
Windows: Tüm talimatları izlememe rağmen PHP ile IIS'yi birlikte çalıştıramadım!

PHP betiğini çalıştıracak kullanıcıların php.exe'yi çalıştırabilecek izinlere sahip olup olmadığına bakın! IIS bunun için kurulumda eklenen bir anonim kullanıcı kullanır. Bu kullanıcının php.exe'yi çalıştıracak izne sahip olması gerekir. Ayrıca, kimlik doğrulaması gerektiren kullanıcıların da php.exe'yi çalıştıracak izne sahip olması gerekir. Ve IIS4'e PHP'nin bir betik yorumlayıcı olduğunu da belirtmeniz gerekir. Ek olarak, bu SSS'yi de okumanızı öneririz.

PHP'yi IIS, PWS, OmniHTTPD veya Xitami ile CGI olarak çalıştırırken şu hatayı alıyorum: Security Alert! PHP CGI cannot be accessed directly..

cgi.force_redirect yönergesine 0 atamalısınız. Öntanımlı değeri 1 olup, php.ini dosyasında bulunduğu satırın başında bir ; varsa o noktalı virgülü silmeniz gerekir.

Öntanımlı değer 1 olduğundan değişikliği doğru php.ini dosyasında yaptığınızdan %100 emin olmalısınız. Daha ayrıntılı bilgi için bu SSS'ye bakınız.

Hangi php.ini dosyasının okunduğunu nasıl anlayacağım? Yaptığım değişikliklerin bir etkisi olmuyor gibi gözüküyor.

php.ini dosyanızın PHP tarafından okunduğundan emin olmak için phpinfo() çağrısı yapmanız gerekir. Sayfanın başına yakın bir yerlerde hangi dosyanın okunduğu bilgisini Configuration File (php.ini) altında görebilirsiniz. Böylece dosyayı nereye koyacağınızı bilirsiniz. Eğer listede sadece bir dizin varsa php.ini dosyanızı bu dizine koymalısınız. php.ini dosyanız listede gösterilen dizinlerden birindeyse okunacak demektir.

Eğer php.ini okunuyor ve siz PHP'yi bir modül olarak çalıştırıyorsanız php.ini dosyanızda değişiklik yaptıktan sonra HTTP sunucunuzu yeniden başlatmayı unutmayınız.

Ayrıca bakınız: php_ini_loaded_file().

PHP dizinimi Windows'ta PATH değişkenine nasıl eklerim?

Windows 7, XP, Vista, 2008, 2012 ve üstünde:

  • Denetim Masasına gidip Sistem simgesini açın (Başlat → Denetim Masası → Sistem).

  • Gelişmiş sekmesine gidin.

  • 'Ortam Değişkenleri' düğmesine tıklayın.

  • 'Sistem Değişkenleri' panosuna bakın.

  • Path girdisini bulun (bulmak için listeyi kaydırmanız gerekebilir)

  • Path girdisine çift tıklayın.

  • Satırın sonuna bir ';' koyup PHP dizini ekleyin (örnek: ;C:\php).

  • Tamam düğmesine tıklayın.

Windows 98/Me sistemlerinde ise autoexec.bat dosyanızı düzenlemeniz gerekecektir:

  • Notepad'i açın (Başlat → Çalıştır ve notepad yazıp enter tuşuna basın)

  • C:\autoexec.bat dosyasını açın.

  • PATH=C:\WINDOWS;C:\WINDOWS\COMMAND;..... satırını bulup satırın sonuna şunu ekleyin: ;C:\php.

  • Dosyayı kaydedin ve bilgisayarınızı yeniden başlatın.

Bilginize: PATH değişkeninde yaptığınız değişikliklerin uygulanmasını istiyorsanız yukarıdaki işlemleri yaptıktan sonra bilgisayarınızı yeniden başlatmayı unutmayınız.

PHP kılavuzunda, dosyaların Windows sistem dizinine kopyalanması salık verilebilir. Bunun sebebi bu dizinin (C:\Windows, C:\WINNT, vs.) öntanımlı olarak sistem PATH değişkeninde bulunmasıdır. Windows sistem dizinine dosya kopyalamak sorunlara yol açması sebebiyle uzun zamandır önerilmemektedir.

Windows üzerinde PHP'nin php.ini dosyasını kullanabilmesini nasıl sağlarım?

Bunu yapmanın çeşitli yolları vardır. Apache kullanıyorsanız kurulumla ilgili talimatları izleyin (Apache 1, Apache 2), aksi takdirde PHPRC ortam değişkenini atamanız gerekecek:

Windows üzerinde:

  • Denetim Masasına gidip Sistem simgesini açın (Başlat → Ayarlar → Denetim Masası → Sistem veya sadece Başlat → Denetim Masası → Sistem).

  • Gelişmiş sekmesine gidin.

  • 'Ortam Değişkenleri' düğmesine tıklayın.

  • 'Sistem Değişkenleri' panosuna bakın.

  • Click on 'Yeni' düğmesine tıklayın ve değişken ismi olarak 'PHPRC', değer olarak da php.ini dosyanızın bulunduğu yeri yazın (örnek: C:\php)

  • Tamam düğmesine tıklayın ve bilgisayarınızı yeniden başlatın.

Windows 98/Me sistemlerinde ise autoexec.bat dosyanızı düzenlemeniz gerekecektir:

  • Notepad'i açın (Başlat → Çalıştır ve notepad yazıp enter tuşuna basın)

  • C:\autoexec.bat dosyasını açın.

  • Dosyanın sonuna şu satırı ekleyin: set PHPRC=C:\php (burada C:\php yerine php.ini dosyanızın bulunduğu dizini yazın). Belirttiğiniz dizinin boşluk karakteri içermemesine dikkat ediniz. Örneğin, PHP'yi C:\Program Files\PHP altına kurduysanız bunu C:\PROGRA~1\PHP şeklinde belirtmelisiniz.

  • Dosyayı kaydedin ve bilgisayarınızı yeniden başlatın.

PHP ile Apache içerik dili uzlaşımını kullanmak (MultiViews seçeneği) mümkün mü?

PHP'yi dosya uzantıları ile ilişkilendirirseniz herşey düzgün çalışır. Bu SSS'de PHP dosyalarını uzantısız ilişkilendirdiğinizi ve içerik uzlaşımında PHP dosyalarının uzantılarına bakılmaksızın seçilmesini istediğinizi varsayacağız. Bu durumda, AddType application/x-httpd-php .php yerine şunları yazın:

AddHandler php5-script php
AddType text/html php
Bu çözüm PHP'nin bir modül olarak çalıştığı Apache 1'de php-script yakalanmayacağından çalışmayacaktır.

PHP'nin GET ve POST istekleri dışında istekleri işleme sokmaması sağlanabilir mi?

Hayır. PHP, CONNECT gibi her istek yöntemiyle çalışabilir. Doğru yanıt durumu header() ile gönderilebilir. Eğer sadece GET ve POST yöntemlerinin işleme sokulmasını istiyorsanız bunu Apache yapılandırmanızda şöyle sağlayabilirsiniz:

<LimitExcept GET POST>
Deny from all
</LimitExcept>