Merhaba arkadaşlar. Bu konumuzda php exec fonksiyonu ve faydalarını göstereceğim. Eğer bir limux server'niniz var ise bu fonksiyon ile sunucuya girmeden işlemler yaptırabilirsiniz. Bu konuya girmeden önce önemli hatırlatma yapayım. Bir çok linux server'de varsayılan olarak bu fonksiyon kapalıdır. php.ini dosyanızdan --> disable_funtions satırını bulun ve değer olarak exec ve shell_exec var ise silelim kayıt edelim ve serveri yeniden başlatalım...

Eğer cPanel kullanıyorsanız işiniz daha kolay. WHM'den giriş yapalım ve MultiPHP Manager açalım. Hangi sitede çalışıyorsak onu işaretleyelim ve PHP-FPM özelliğini devre dışı bırakalım. İşlem bu kadar ve artık exec fonksiyonu kullanılabilir.

Bu fonksiyon aslında Putty programında olduğu gibi serverimizde komut çalıştırmaya yarar. Yani PuTTy'denasıl komut yazıyorsak bu konksiyon ile de yazabiliriz. Bir kaç işimize yarayacak kısmından bahsedeyim.

1.) İndirme ve Kaydetme Örneği

Bir çok kişi indirme işlemlerini kullanır. İndirme görünen şekliyle 2 türlüdür. 1.'si sitenin arayüzünden yaparız f_open, curl gibi fonksiyonlar ile. Ama arayüzden yaptığımız indirmeler hem yavaş hem de sunucuyu yorar ve eğer dosya uzun ise belli süreden sonra request time out, connet time out gibi hatalar alırız ve işlem iptal olur. 2. İndirme yöntemi de sunucunun gücünü kullanarak daha hızlı bir yöntemidir. Hem arka planda çalışır hem de daha hızlı indirme sağlanır. Şimdi size exec ile bu basit ama etkili yöntemi bir fonksiyon yazarak göstereceğim.
<?php
function fast_download($url, $dizin) {
exec("wget -c $url -P $dizin", $output, $return);
if (!$return) {
echo "Dosya İndirme Başarılı";
} else {
echo "Dosya İndirilirken Sunucu Hatası Meydana Geldi";
}
}
// wget komutu linux sunucularda indirmek için kullanılır.
// -P ise indirilen dosyanın hangi klasöre kayıt edilmesi gerektiği hakkında sunucuyu yönlendirir. Biz kaydedilecek dizini $dosya_kayıt_dizini adlı değişkene zaten tanımlama yapmıştık.
// -c komutu ise bağlantı kopar veya indirme işlemi yarıda kalırsa, kaldığı yerden devam etmek için kullanılır.

$site_dizini = $_SERVER['DOCUMENT_ROOT'];
//sitemizin hangi bölümde kurulduğu bilgisini verir. Bu sayede kolayca dosyayı sitemizde istediğimiz alana kayıt edebilceğiz.

$dosya_kayit_dizini = "$site_dizini/demo/kayit";
// demo/kayit/ sitemizin ana dizini nere ise "genelde public_html olur" o ana dizinde demo/kayit klasörüne indirilen içerik kaydedilir. Eğer ana dizin üzerinde demo/kayit dizini yok ise komut otomatik olarak dizin oluşturup kaydeder.

$dosya_url = "https://www.w3schools.com/html/mov_bbb.mp4";
// indirilecek dosyanın tam adresini buraya yazalım

fast_download($dosya_url, $dosya_kayit_dizini);
// fonksiyonumuzu çalıştırdık. İndirme işlemi bitince döngü yapacak ve kayıt edilirse dosya başarılı diyecek kayıt edemezse başarısız diyecek.
?>
Bu fonksiyon özellikle indirilmesi çok büyük dosyayı sunucuya çekmek için ideal bir yöntemdir.

2.) Sunucuyu Kapatma ve Yeniden Başlatma Komutları

Yine exec kullanarak bir fonksiyon oluşturup sunucumuzu site üzerinden yeniden başlatabiliriz.

<?php
function server_komut($komut) {
exec("$komut", $output, $return);
if (!$return) {
echo "Komut Başarıyla Uygulandı";
} else {
echo "Komut Uygulanırken Hata Meydana Geldi";
}
}

// server yeniden başlatma ve kapatma seçenekleri
$reboot = "reboot";
// sunucuyu zarifçe kapatır yani zorlamadan açar ve kapar. Bu en sağlıklı olandır.

$reboot_f = "reboot -f";
//sunucuyu zorla açar ve kapatır. Anında herşey sıfırlanır

$shutdown_h_now = "shutdown -h now";
//sunucuyu durmadan hemen kapat anlamına gelir

$shutdown_time = "shutdown -h +5";
// sunucuyu 5 dakika içinde kapat anlamına gelir +5 dakikayı ifade eder. Bu nedenle 5 yerine kaç dakika sonra sunucuzun kapanmasını istiyorsanız onu yazabilirsiniz.

$shutdown_r_now = "shutdown -r now";
// sunucuyu hemen durmadan yeniden kapayıp/açmaya yarar. -r komutu sunucuya Restart at anlamına gelmektedir.

$shutdown_r_timer = "shutdown -r +5"
// bu komut sunucuyu 5 dakika sonra kapa/aç (restart at) anlamına gelir. +5 dakika anlamına gelir. Sunucuyu kaç dakika sonra kapa/aç yapacaksanız 5'i değiştirmeniz yeterli.

server_komut($reboot);
// fonksiyonu çalıştırdık. $reboot değeri yerine yukarıdaki kodlardan hangisi işinize yarayacaksa kullanabilirsiniz.
?>
İlk dersimiz burada sona erdi. Diğer Derslerde görüşmek üzere