"PHP" Etiketindeki Gönderiler

PHP etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

 Herkese Merhaba,

Bugün sizlere çok spesifik bir yazılımdan bahsetmek istiyorum; "Avantfax". Avantfax nedir? Avantfax, Hylafax sunucusu için PHP ile geliştirilmiş bir web arayüz. Yaptığı iş en basit tanımla; Hylafax sunucusu ile bütünleşik çalışarak size fax alma veya gönderme işlerinizi web tabanlı yürütmenizi sağlayacak bir ortam sunmak. İşyerimizde çok uzun yıllardır fax için kullandığımız bir ikili Hylafax/Avantfax. Toner ve kağıt tasarrufu sağlayabilen esnek bir ikili. Bir fax/modem ve bir bilgisayar ile işyerinizin tüm fax alma ve gönderme işlemlerini bir web arayüzü ile halletmenizi sağlayabilen hoş bir çözüm. Ancak her güzelin kusurları olduğu gibi Avantfax'ın da bazı kusurları var. Uzun süredir geliştiricileri tarafından geliştirilmediği için demode hale gelmiş pek çok bağımlılığı var. Örneğin Avantfax kullanmak için PHP5 kullanmak zorundasınız. MySQL'in de eski versiyonlarından birisini sisteme yüklemek gerekiyor. Bunun dışında Avantfax, görsel dosyalarda çok miktarda format değişimi, ölçeklendirme, dönüştürme işlemi yaptığı için bazı kütüphanelere de ihtiyaç duymakta. Bugün size ImageMagic kütüphanesi sebebi ile yaşadığım bir sorunu ve bunun çözümünü anlatmak istiyorum. Buraya not alıyorum ki hem bu sorunu yaşayan birine yardımı olabilir (Türkiye'de Avantfax kullanan kaç kişi var inanın bilmiyorum :) hem de ileride aynı sorunu tekrar yaşarsam bana da hatırlatıcı olsun. Öncelikle sorunu tanımlayarak başlayalım..

Bir süredir Avantfax gelen kutusunda gelen faksların thumb.gif dosyalarının düzgün yüklenmediğine şahit oluyordum. Eskiden bir faks geldiğinde ilgili satırın başında bu faksın minik bir görseli yerleştirilirdi. Bunun yerine şöyle bir manzara görmeye başladım;

Gördüğünüz gibi gelen fakslar için ön izleme dosyası olan thumb.gif düzgün şekilde oluşturulmamış ve bu sebeple de standart bir görsel yüklenmiş. Başlarda bunu önemsememiştim. Dün bu neden olur diyerek konuyu biraz araştırıp nedenini bulmak istedim. Sizlerle de bu yazıda bulduklarımı paylaşacağım.

Öncelikle bu durumu tekrar edilebilir bir şekilde denemek gerekiyordu. Hatayı tespit etmek veya düzelip düzelmediğini anlamak için yeni fax gelmesini beklemek çok da mantıklı olmazdı. Biraz internet araştırması sonucunda yeni gelen bir faksı nasıl simüle edebileceğimizi öğrendim. Bir fax geldiği zaman Hylafax tarafından tetiklenen faxrcvd.php betiğini komut satırından belli parametreler ile çağırmak yeni gelen bir faksı işlemekle aynı şekilde işlem yapıyor. Bu bilgiyi Avantfax Proje Sayfasında bir kullanıcının benzer sorunla ilgili yaptığı bildirim mesajında buldum ( https://sourceforge.net/p/avantfax/discussion/540878/thread/1b384150/ ) Bu adreste gördüğünüz komut satırı kullanımı çalışıyor. Sizler için hem komutu hem de açıklamasını yapmaya çalışacağım. Öncelikle ben Avantfax'ı Ubuntu Server 20.04 bir sistemde çalıştırıyorum. Vereceğim yollar bu sisteme göredir. Hylafax ile ilgili dosyaların benim kurulumumda bulunduğu yer /var/spool/hylafax bu dizine geçiş yapalım;

# cd /var/spool/hylafax

Bu dizin içindeyken şu komutu veriyoruz;

# sudo -u uucp bin/faxrcvd.php recvq/fax000004830.tif ttyUSB0

Komutu kısaca açıklayayım; sudo -u uucp komutu uucp kullanıcısı olarak çalıştırmamızı sağlıyor. Bu önemli,  çünkü faxrcvd.php betiği tmp ve faxes dizinlerine dosyalar oluşturup kaydediyor ve bu dizinlerin kullanıcı hakları uucp kullanıcısına gerekli izinleri veriyor. Ayrıca bir faks geldiğinde Hylafax faxrcvd.php yi yine bu kullanıcı hakları ile çalıştırdığı için bizim de aynı kullanıcı ile bu işlemi yapmamız yerinde olur. bin/faxrcvd.php çalıştırmak istediğimiz PHP betiği. Bu betiği Avantfax kurulumunda Hylafax bin dizinine bağlamış olduğunuzu varsayıyorum. recvq/fax000004830.tif ise PHP betiğimize yolladığımız ilk parametre. recvq dizini Hylafax tarafından teslim alınan faksların tif formatından depolandığı alan. Bu dizinde herhangi bir tif dosyasını parametre olarak verebilirsiniz. ttyUSB0 ise Avantfax ile kullandığınız modemin arabirim ismi. Bu parametreyi kendi kurulumunuza göre ttyS0 veya uygun şekilde düzenlemeniz gerekiyor. Komutu verdiğimde şöyle bir çıktı ile karşılaştım;

faxrcvd> executing: recvq/fax000004832.tif ttyUSB0 '' '' CIDNum: '' CIDName: '' DID: '' faxrcvd> PROCESSING FAX from '2122025195' (1 pages) received '2024:05:28 14:07:58' /usr/bin/tiffcp recvq/fax000004832.tif /var/www/html/avantfax/faxes/recvd/2024/05/28/2122025195/000004832/fax.tif
Create PDF
Create Thumbnails convert: no decode delegate for this image format `TIFF' @ error/constitute.c/ReadImage/572. convert: no images defined `/var/www/html/avantfax/faxes/recvd/2024/05/28/2122025195/000004832/thumb.gif' @ error/convert.c/ConvertImageCommand/3258. PHP Warning: chmod(): No such file or directory in /var/www/html/avantfax/includes/functions.php on line 1238 Processing page 1 FAXPATH: /faxes/recvd/2024/05/28/2122025195/000004832 faxrcvd> Inserted /var/www/html/avantfax/faxes/recvd/2024/05/28/2122025195/000004832 from 2122025195 to Inbox ocr_faxcontent> /usr/local/bin/tesseract not found

Soruna dair ilk emareyi böylece yakalamış olduk. thumb.gif oluşturulmak istenilirken convert komutunun çalışmadığını böylece anlamış olduk. Ama nedenini ve nereye bakmamız gerektiğini henüz bilmiyoruz. faxrcvd.php betiğinde bu hatayı oluşturan fonksiyonun static_preview() isimli bir fonksiyon olduğunu buldum. Ve include/functions.php dosyasında bu fonksiyonun tanımlandığı kısma odaklandım. Soruna neden olan kısım şurası idi;

        foreach ($faxfiles as $file) {
            if (!strstr($file, "thumb_"))
                continue;
           
            $newfile = "${basedir}${file}";
                       
            if ($cnt === 0) {
                system("$CONVERT -scale ".PREV_TN." $newfile $preview");
                chmod($preview, 0666);
            }
           
            echo "Processing page ".($cnt+1)."\n";

            $final_file = $path.DIRECTORY_SEPARATOR.PREVIMG.$cnt.PREVIMGSFX;
//            system("$CONVERT -scale ".PREV_SP." $newfile $final_file"); // doesn't work on all TIFs
            system("$TIFFPS $newfile > $tmpfile.ps 2>/dev/null");
            system("$GSN -sOutputFile=$tmpfile.2 $tmpfile.ps -c quit > /dev/null 2>&1");
            system("$PNMSCALE -width ".PREV_SP." $tmpfile.2 2>/dev/null | $PNMDEPTH 31 | $PPMTOGIF 2>/dev/null > $final_file");
           
            chmod($final_file, 0666);
            $cnt++;
        }

Bu kodda system("$CONVERT -scale ".PREV_TN." $newfile $preview"); satırı hataya neden oluyordu. convert komutu tif formatından gif formatına ölçeklendirme yaparak kayıt yapmıyordu bir şekilde. Bunun yarattığı sorunu geliştiriciler de bir alt satırda alenen yazmış aslında. Dikkat ederseniz;

//            system("$CONVERT -scale ".PREV_SP." $newfile $final_file"); // doesn't work on all TIFs

benzer bir işlemin yürütüldüğü ve prev0.gif dosyasının oluşturulduğu alt satırlarda kod comment ile kapatılmış ve sonuna tüm tiflerle çalışmadığı yazılmış. prev0.gif oluşturulurken kullanılmasından vazgeçilmiş bir yöntemin thumb.gif oluşturulurken neden kullanılmaya devam ettiğini bilmiyorum. Fakat çözümün buradan geçtiğini tahmin ettim. thumb.gif dosyasını oluşturan kodları da prev0.gif dosyasını oluşturan kod gibi düzenlersek bu sorunun ortadan kalkacağını varsaydım. prev0.gif oluşturulurken direkt tif dosyasını gif dosyasına çevirmek yerine önce ps formatına dönüştürüp bir kaç basamaktan geçirmiş geliştiriciler. Benzer bir yaklaşımı ben de yukarıda kullandım ve kod şöyle oldu;

/*            if ($cnt === 0) {
                system("$CONVERT -scale ".PREV_TN." $newfile $preview");

                chmod($preview, 0666);
            }*/
if ($cnt === 0) {
    system("$TIFFPS $newfile > $tmpfile.ps 2>/dev/null");
    system("$GSN -sOutputFile=$tmpfile.2 $tmpfile.ps -c quit > /dev/null 2>&1");
    system("$PNMSCALE -width ".PREV_TN." $tmpfile.2 2>/dev/null | $PNMDEPTH 31 | $PPMTOGIF 2>/dev/null > $preview");
    chmod($preview, 0666);
}

Gördüğünüz gibi eski kodu comment edip yerine altta bulunan yeni yaklaşımı kaydettim. Sonrasında yukarıda yazdığım şekilde faxrcvd.php dosyasını komut satırı ile çalıştırdım ve sonuç;


Evet artık thumb.gif dosyamız başarı ile oluşturuluyor ve gösteriliyor. Bu sorunu gidermiş olduk. Faydalı olmuş olması dileği ile..

Saygılar..

 

Merhaba,

FreeBSD üzerinde kurulu PHP+Nginx web sunucumda tarih ile alakalı bazı sorunlar olduğunu farkettim. Şöyle ki sunucumda yapılan işlemlerde UTC+3 değil UTC+0 zaman dilimi kullanılıyor ve tüm işlemler 3 saat geriden yapılıyordu.

Durumdan emin olmak için bir test yapmak istedim. Saati veren bir PHP Scripti sunucumda çalıştırdım ve gerçekten de PHP işlemlerinde saat bilgisinin hatalı olduğunu farkettim. Kullandığım script ve verdiği çıktıyı aşağıya ekliyorum.

 

 

Kullandığım script;

    <?php echo "Saat " . date("h:i:sa"); ?>

Bu scriptin verdiği saat bilgisi şöyle;

    Saat 06:38:19am

Oysa sistem saati o anda;

    # date
    Thu Sep  1 09:38:20 +03 2022

 Sistem saati UTC+3 olduğu halde PHP Scriptleri UTC+0  olarak sonuç veriyor. Bu durumu düzeltmek için php.ini dosyasında ufak bir değişiklik yapmamız gerekiyor. FreeBSD üzerinde standart PHP kurulumunda php.ini dosyasının yolu /usr/local/etc/php.ini olarak belirleniyor. Bu dosyayı açıp içerisindeki şu satırı bulunuz;

    ;date.timezone =

Bu satırın başındaki ; işaretini kaldırıp şu değeri verelim;

    date.timezone = Europe/Istanbul

Burada ters slash işaretine dikkat edelim, normal slash konulursa ayar doğru çalışmıyor. Dosyayı kaydedip çıkarak kuruluma göre web sunucumuzu veya PHP-FPM'i yeniden başlatıp sonucu kontrol edelim. Yukarıdaki scripti çağırdığımızda saat doğru geliyor ise PHP için time-zone ayarımızı başarı ile yapmışız demektir.

Bu dökümanda FreeBSD 13 sistemimiz üzerinde kurulu Apache sunucumuzu php-fpm kullanarak PHP çalıştırır hale getireceğiz. Malum bu işi yapmanın diğer yolu; Apache'yi PHP modülü ile kullanmak. Bu dökümanda daha performanslı çalıştığı söylenen php-fpm ile Apache ve PHP'yi birbiri ile bağlayacağız.
 
Öncelikle Apache ve PHP paketlerini uygun modüller ve ayarlarla kurmamız lazım. Kurulumu ports ile yapıyorsanız ön tanımlı ayarlarda ihtiyacınız olan seçenekler seçili halde oluyor. Apache ve PHP için ön tanımlı değerlerle devam edebilirsiniz. Kurulumlar yapıldıktan sonra düzenleyeceğimiz ilk dosya httpd.conf olacak. Dosyayı açarak aşağıdaki satırları bulun ve örneğe göre düzenleyin. FreeBSD'de ports üzerinden kurulmuş Apache 2.4 için httpd.conf dosyasının yolu;
 

 

 Gerekli modülleri aktif hale getirmiş olduk. Modüllerle ilgili yaptığımız ayarın geçerli hale gelmesi için Apache servislerini yeniden başlatalım:

 PHP-FPM

PHP-FPM (FastCGI Process Manager), ağır yüklü siteler için yararlı olabilen bazı ek özelliklere sahip alternatif bir PHP FastCGI uygulamasıdır. Yazının giriş bölümünde de bahsettiğimiz Apache web sunucusunun PHP modülü ile kullanımı aşağıda şematize edilmiştir.

İstemci (browser), sunucudan bir PHP sayfası talep ettiğinde Apache bu sayfayı PHP modülüne yorumlatıp sonucu istemciye gönderir. Burada PHP yorumlama işinin Apache servisi içinde yapıldığına dikkat edin. PHP-FPM kullandığımızda ise aşağıda bulunan yapı oluşacaktır.


Gördüğünüz gibi Apache bu sefer PHP kodlarının yorumlanmasını kendi içerisindeki PHP modülü yerine, bağımsız bir servis olarak çalışan FPM uygulamasına yaptırıyor. İşin mantığı genel olarak bu. Şimdi gerekli düzenlemeleri yapalım. PHP-FPM bir servis olarak çalışıyor demiştik. Öncelikle bu servisi çalıştırabilmek için /etc/rc.conf içerisine gerekli satırı ekleyelim:

ve servisi çalıştıralım:

Ön tanımlı olarak php-fpm, arka planda 9000 numaralı TCP portunu dinleyecek ve yalnızca yerel makineden gelecek bağlantı isteklerini kabul edecek şekilde ayarlıdır. Eğer php-fpm servisini başka bir makinede çalıştırmayı planlamıyorsanız TCP yerine Unix soketi dinlemek daha hızlı ve daha güvenli bir yol olacaktır. Bu şekilde yapılandırmak için /usr/local/etc/php-fpm.d/www.conf dosyasını açalım ve aşağıdaki şekilde düzenleyelim:
Bu değişikliklerin etkili olabilmesi için php-fpm servisini yeniden başlatmak gerektiğini unutmayın. Aynı durum PHP ile ilgili yapacağınız tüm değişimlerde geçerli. mod_php kullandığınız zamanlarda Apache servisini yeniden başlatmak PHP ayarlarında yaptığınız değişimleri etkin hale getiriyordu ancak şu anda bu işi php-fpm servisi yaptığı için PHP ve php-fpm üzerinde yaptığımız tüm değişikliklerde php-fpm servisini yeniden başlatmayı unutmayalım.

Son olarak Apache üzerinde küçük bir ayar yapmamız lazım. /usr/local/etc/apache24/Includes/php-fpm.conf dosyasını açalım ve şu içeriği ekleyelim:

Tüm ayarlamaları yaptık. Apache servisini yeniden başlatalım:
Yaptığımız konfigürasyonu test edebiliriz. Web sunucumuzda bir php dosyası oluşturup <?php phpinfo();?> kodlarını bu sayfamıza yerleştirelim. Sayfayı ziyaret edelim:


Server API satırında FPM/FastCGI görüyorsanız tebrikler, sunucunuzda Apache+PHP-FPM yapılandırmasını doğru şekilde yapmışsınız..

Author Name

İletişim Formu

Ad

E-posta *

Mesaj *

Blogger tarafından desteklenmektedir.