Skip to content

güncel bir php sürümü yükledikten sonra unutulması gerekenler

linux tabanlı bir sistemden php + apache ikilisinde yeni bir php sürümü yüklenince güncel php sürümünü kullanmak için eski sürümü pasif ederek yeni sürümü aktif etmek ihtiyacı bulunmaktadır.

sudo a2dismod php* 
sudo a2enmod php8.2 
sudo systemctl restart apache2 

sunucuda farklı bir php sürümünü kullanmak

sunucuya yeni php sürümünü yükledikten sonra bazı sitelerin çalışmadığı şikayetleri geldi. sunucu üzerinde birden fazla php sürümü yüklü ve siz bunlardan bir tanesi özellikle kullanmak istiyorsanız .htaccess dosyası içerisine aşağıdaki satırı ilave ederek kullanabilirsiniz. ( bu örnekte php için php5.6 versiyonu kullanılmak istenmektedir )

AddHandler application/x-httpd-php56 .php

 

raspberry üzerinden okunan verinin python ile mysqle eklenmesi ve google chart ile bu verinin grafiğinin oluşturulması örneği

daha önceki örneklerimizde raspberry nin sistem özelliklerini okumayı ve bu verileri rrd veri tabanına kaydetmeyi ve izlemesi konusunda örnekler yapmıştık.

bu yöntemin uygun olmayacağı veya istenmeyeceği durumlar olabilir. böyle bir durum olduğunu düşünerek okuduğumuz cpu sıcaklık değerini bir veri tabanına (örneğimizde mysql olacak) kaydedelim ve dinamik bir arayüz ile veri tabanına kaydettiğimiz verileri kullanıcılarımız sunacağımız bir uygulama geliştirelim.

öncelikle veri tabanımızda hangi verilerin olacağını belirlemeli ve veritabanımızı oluşturmalıyız. raspberry pinin klasik dağıtımları üzerinde mysql, php, apache gibi sunucu yazılımları mevcut değil. bunları kurmanız gerektiğini unutmayınız. internette konu hakkında dokümanlar mevcut. uygun bir zamanda detaylı olarak onuda ekleyebiliriz. bunların olduğunu var sayarak esas konumuza dönelim.

bu örneğimizde tarih ve saat verisinin yanında sadece sıcaklık değerini tutmamız yeterli olacaktır.

sudo mysql -u root -p

CREATE DATABASE raspberry_sistem;
USE raspberry_sistem;

CREATE TABLE cpu_temp ( id INT NOT NULL AUTO_INCREMENT,
                      tarih DATE NOT NULL,
                      saat TIME NOT NULL,
                      sicaklik varchar(50),
                      PRIMARY KEY ( id ));

GRANT INSERT,SELECT ON raspberry_sistem.* TO 'raspberry'@'localhost' IDENTIFIED BY 'pi';
FLUSH PRIVILEGES;

artık veritabanımız hazır. sıra sıcaklık değeri okuyarak veri tabanına eklemeye geldi. ben örneğimi python kullanarak yapacağım. benim kullandığım python kütüphaneleri sizin raspberry üzerinde olmayabilir. kodun çalışması için eksik kütüphaneleri yüklemeniz gerekmektedir.

#sicaklik_cpu.py  dosyasi
import time
import os
import fnmatch
import MySQLdb as mdb
import logging
import time
import datetime

#cpu sicaklik degerinin okunmasi
def cpu_sicaklik_oku():
 res = os.popen('vcgencmd measure_temp').readline()
 return(res.replace("temp=","").replace("'C\n",""))


#mysql veritabanina veri eklenmesi
def insertDB(cpu_sicaklik):
  sql = "INSERT INTO cpu_temp (tarih, saat, sicaklik) VALUES ('%s', '%s', '%s' )" % (time.strftime("%Y-%m-%d"), time.strftime("%H:%M"), cpu_sicaklik)

  try:

    con = mdb.connect('localhost', 'raspberry', 'pi', 'raspberry_sistem');
    cursor = con.cursor()
    cursor.execute(sql)
    con.commit()
    con.close()

  except mdb.Error, e:
    logger.error(e)

#sicaklik okuma ve veritabanina yazma fonksiyonlarini calistiralim
cpu_sicaklik = float(cpu_sicaklik_oku())
print cpu_sicaklik
insertDB(cpu_sicaklik)

kodun oldukça sadece ve anlaşılır olduğunuz düşüyorum. temel olarak sıcaklık verisinin okunmasını ve bu verinin veri tabanına eklenmesini sağlayarak iki ayrı fonksiyon oluşturduk. ve bu fonksiyonları sırası ile çağırıyoruz.

komut satırından kodumuzu test edelim.

pi@cicek /var/www/raspberry $ sudo python sicaklik_cpu.py 
54.1

sıcaklık değeri okundu ve ekrana yazıldı ve herhangi bir hata vermedi. kontrol için eklediğimiz kodu “print cpu_sicaklik” her şey tamam olduktan sonra kaldıracağız. veri tabanına gerekli veri girişi doğru şekilde yapıldığının kontrolünü de yapalım.

mysql> select * from cpu_temp;
Empty set (0.01 sec)

mysql> select * from cpu_temp;
+----+------------+----------+----------+
| id | tarih      | saat     | sicaklik |
+----+------------+----------+----------+
|  1 | 2015-07-19 | 22:35:00 | 54.1     |
+----+------------+----------+----------+
1 row in set (0.00 sec)

kodumuz sağlıklı olarak çalışıyor. şimdi bu işlemi otomatikleştirmek için crontab içine yerleştirelim.

pi@cicek /etc $ cat /etc/crontab 

*/5 *  * * *   root    sudo python /var/www/raspberry/sicaklik_cpu.py

5 dakika bir çalışacak şekilde gerekli ilavemizi de yaptıktan sonra sıra kullanıcı arayüzüne geldi. grafik çizimi için google chart servisini line chart kullanacağım. detaylı bilgiyi https://developers.google.com/chart/interactive/docs/gallery/linechart adresinden alınabilir.

bu servis sayesinde grafik kütüphaneleri ile fazla uğraşmayacağım ve işimi kolayca halledeceğim.

<!DOCTYPE html>


	<script type="text/javascript" src="https://www.google.com/jsapi"></script>
		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
		<script type="text/javascript">
			google.load('visualization', '1', {'packages':['corechart']});
			google.setOnLoadCallback(drawChart);

			function drawChart() {
				var json = $.ajax({
					url: 'get_json.php', 
					dataType: 'json',
					async: false
				}).responseText;
				
				var data = new google.visualization.DataTable(json);
				var options = {
					title: 'Raspberry CPU Sicaklik',
					width: 600,
					height: 400
				};
				var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
				chart.draw(data, options);

				setInterval(drawChart, 500 );
			}
		</script>  



  <div id="chart_div" style="width: 600px; height: 400px;"></div>

yukarıdaki kodu index.html olarak kaydelim ve esas işi yapacak get_json.php php dosyamızı da oluşturalım

<?php

$con = mysql_connect('localhost', 'raspberry', 'pi') or die('veri tabani baglanti hatasi');
mysql_select_db('raspberry_system', $con); 
$query = mysql_query('SELECT * FROM cpu_temp');

$table = array();
$table['cols'] = array(
    array('label' => 'saat', 'type' => 'string'),
	array('label' => 'sicaklik', 'type' => 'number')
);

$rows = array();
while($r = mysql_fetch_assoc($query)) {
    $tempa = array();
	$tempa[] = array('v' => $r['saat']);
	$tempa[] = array('v' => (int) $r['sicaklik']); 
    $rows[] = array('c' => $tempa);
}

$table['rows'] = $rows;

$jsonTable = json_encode($table);

header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');

echo $jsonTable;
?>

adres satırına raspberry adresini yazdığımızda göreceğimiz grafik aşağıdaki gibi olacaktır.

apache web server üzerinde kullanıcı dizin yapısını aktifleştirmek

Linux üzerinde Apache kullanıyor ve Linux üzerindeki kullanıcılarınıza bir alan açmak istiyorsanız bu işlem için en kolay yöntem userdir eklentisini aktifleştirmek olacaktır. Bunun ne kadar güvenli ve yönetilebilir olduğu tartışılır ancak en kolay yöntem olduğu kesin.

Gerekli modüllerin ve araçların yüklü olduğundan emin olunmalıdır. Aşağıdaki örnek debian tabanlı bir dağıtım da uygulanmıştır. Dağıtımlara göre dizin yapısı vb fark edebilir.

A2enmod ile userdir modülünü aktifleştirelim.

sudo a2enmod userdir

Modül aktifleştirdikten sonra Apache konfigürasyon dosyaları altında userdir modülü ile ilgili konfigürasyon dosyaları oluşturulmuştur. Bu konfigürasyon dosyası içinde gerekli düzenlemeleri yapılması gerekmektedir.

sudo nano /etc/apache2/mods-enabled/userdir.conf

Temel konfigürasyon dosyası aşağıdaki gibidir. Kullanıcıya açılan dizin ve erişim yetkisi ayarları doğru şekilde ayarlanmalıdır. Yoksa başımıza olmadık işler açabilir.


        UserDir public_html
        UserDir disabled root
 
        
		AllowOverride All
		Options MultiViews Indexes SymLinksIfOwnerMatch
		
			# Apache < = 2.2:
		        Order allow,deny
		        Allow from all
 
		        # Apache >= 2.4:
		        #Require all granted
		
		
			# Apache < = 2.2:
		        Order deny,allow
		        Deny from all
 
			# Apache >= 2.4:
			#Require all denied
		
        


Statik bir alan verecekseniz bu kadar yeterlidir. statik alanmı kaldı diyebilirsiniz. kullanıcıların php kullanmalarını istiyorsanız apachenin php modül konfigürasyon dosyasında gerekli düzenlemeyi yapmanız gerekecektir.

sudo nano /etc/apache2/mods-available/php5.conf

güvenlik gereği kullanıcı dizinlerinde server-side uygulamalar engellenmiş durumdadır. yapılması gereken “php_admin_value engine Off” satırını pasif ederek sunucu yeni konfigürasyonu ile başlatmaktır.


    
	SetHandler application/x-httpd-php
    
    
	SetHandler application/x-httpd-php-source
    
    # To re-enable php in user directories comment the following lines
    # (from  to .) Do NOT set it to On as it
    # prevents .htaccess files from disabling it.
    
        
    #        php_admin_value engine Off
        
    


sunucumuzu yeniden başlattıktan sonra mevcut kullanıcılar için public_html dizinini oluşturmayı unutmayalım..

sudo service apache2 restart
mkdir /home/$USER/public_html

godaddy drupal PDOException hatası

eğer godaddy suncuuları üzerindeki sitelerinizde aşağıdaki hata ile karşılaşırsanız herhangi bir database inizin şifresini güncelleyiniz. tüm sitelerinizdeki alınan hata ortadan kalkacak.. godaddy saçmalığı…

PDOException: SQLSTATE[HY000] [2013] Lost connection to MySQL server at ‘reading initial communication packet’, system error: 111 in lock_may_be_available() (line 167 of /html/www/includes/lock.inc).

 

 

php ile blackbery cihazları algılama

en basit hali ile aşagıdaki şekilde yapılabilir.

< ?php
   $ua = strtolower($_SERVER['HTTP_USER_AGENT']);
   $pos_blackberry = strrpos($ua, "blackberry");
   $pos_webkit = strrpos($ua, "webkit");
   $url = "http://optimizedmobile.yoursite.com/";

   if (!($pos_blackberry === false))
   {
      if (!($pos_webkit === false))
      {
         header("Location: " . $url);
      }
   }
?>

docman 1.4rc1 arama hatası

docman 1.4rc1 in arama sırasında oluşan

Warning: Invalid argument supplied for foreach() in /www/htdocs/_username_/joomla/components/com_docman/themes/default/templates/documents/tasks.tpl.php on line 36

hatasını düzeltmek için tasks.tpl.php dosyasının 36. satırı

foreach($this->doc->buttons as $button) {

aşagıdaki gibi değiştiriyoruz.

foreach($this->doc->links as $button) {

Kredi kartı numara doğrulama

Gelen bir epostada kredi kartı numarası nasıl doğrulanır şeklinde bir soru vardı.

Cevap : Luhn algoritmasıdır. Bir çok kişiye bu anlamsız gelebilir. Bunu basit bir örnekle açıklamayalım

16 Haneli bir kredi kartı numaramız olsun

6 7 6 2 0 5 0 1 2 1 5 2 6 3 8 4
Kart No 6 7 6 2 0 5 0 1 2 1 5 2 6 3 8 4
adım 1 6×2 6×2 0x2 0x2 2×2 5×2 6×2 8×2
12 12 0 0 4 10 12 16
adım 2 1+2 1+2 0 0 4 1+0 1+2 1+6
3 7 3 2 0 5 0 1 4 1 1 2 3 3 7 4
adım 3 3+7+3+2+0+5+0+1+4+1+1+2+3+3+7+4
46
adım 4 mod10(46) = 6

Adım 1 : Sağ taraftan başlayarak çift haneli sayıları iki ile çarpıyoruz

Adım 2 : Adım birde bulduğumuz yeni sayının haneler toplamını buluyoruz

Adım 3 : Yeniden oluşmuş olan 16 haneli sayımızın haneler toplamını buluyoruz

Adım 4 : Adım 3 de bulunan sayının mod 10 değerini buluyoruz

Adım 4 sonucunda bulunan değer 0 ise bu sayı Luhn algoritmasını
gerçekliyordur. Yani elimizdeki kredi kartı numarası
geçerli bir kredi kartı numarasıdır diyebiliriz.

Bunun için basit bir php script ise aşağıdaki şekilde yazılabilir.

< ?php

$sayi="12231231131";

$odd = !strlen($sayi)%2;

$toplam = 0;

for($i=0;$i<strlen($sayi);++$i) {

$n=0+$sayi[$i];

$odd=!$odd;

if($odd) {

$toplam+=$n;

} else {

$x=2*$n;

$toplam+=$x>9?$x-9:$x;

}

}

if (($toplam%10)==0){  echo $sayi." için luhn algoritmasi geçerli";}

else {echo $sayi." için luhn algoritmasi geçerli değil";}

?>

Çöken Web’e Karşı PHP Çözüm mü?

Lerdorf Internet’in şu an ki durumunu “hasar görmüş parçaların tekrarı” olarak niteliyor ve internet için hala kalan tek umudun PHP’den alınacak yardım olabileceğini söylüyor.

PHP’i 1995 yılında yaratmış olan Lerdorf, Yahoo’da görevli bir PHP geliştiricisi olmasının yanı sıra PHP camiasının da aktif üyelerinden. PHP de, pek çok açıdan değerlendirildiğinde, günümüzde Web uygulamalarında kullanılan en popüler betik dili olarak kabul ediliyor.
Kendisini izlemekte olan kalabalığa oldukça iğneleyici bir dille :

Web oldukça büyük bir zarar gördü, dolayısıyla artık hepimiz evlerimize geri dönebiliriz.
Ama neyse ki, pek çok insan Web’in çöktüğünün farkında değil.

Lerdorf’un Web’i “çökmüş” olarak addetmesinin sebeplerinden birisi, Web’in doğası gereği taşıdığı güvenlik sorunları. Bu sebeplerden birisi ise geliştiricilerin hemen gözlerinin önünde yatıyor. Lerdorf :

Kullanıcı girdilerini filtrelemeniz gerektiğinin farkında bile değilsiniz.

diyor. Lerdorf, PHP geliştiricilerine, kablolar aracılığı ile kendilerine ulaşan hiçbir şeye güvenmemelerini tavsiye ediyor.

Lerdorf’un Apache HTTP Web sunucusu için “ahmaklık” tabirini kullanıyor. Benzer şekilde Microsoft Internet Explorer için;

Ama, karakter seti saptaması, keyfi başlık enjeksiyonu (arbitrary header injection), host header spoofing (host başlığı yanıltımı) ve request splitting (talep bölünmesi) gibi “ahmaklık” vakalarının yaşandığı Microsoft’un Internet Explorer’ı da var.

diyor ve Lerdorf bunu şöyle özetliyor :

IE pek çok açıdan tamamen çökmüş durumda.
Ama PHP sayesinde IE’nin çökme sebeplerinden bir kaçının üstesinden gelinebilir

Karakter seti saptaması söz konusu olduğunda Lerdorf geliştiricilere, PHP uygulamalarında default bir “charset” atadıklarından emin olmalarını salık veriyor.

PHP 5, geliştiricilerin Web’in “çökmesini” engellemelerine yardımcı olacak filtre talepleri için gerekli olan tüm işlevselliği sunuyor. Lerdorf

Her şeyi filtrelemeli ve ardından bu filtrelerde veri akışı için küçük delikler açmalısınız.

tavsiyesinde bulunuyor. Örneğin AJAX ve Web servislerince kurulan Zengin Web uygulamaları, modern Internet’in kilit noktalarını oluşturur. Artık, gelişimin performansı ve rahatlığı oldukça çökmüş durumda.

Lerdorf, Yahoo’nun konuşlandırdığına benzer zengin Web uygulamalarının, fevkalade yanıt sürelerine sahip olmaları ve yüksek sayıda kullanıcı ile başa çıkabilmeleri gerektiğini vurguluyor.

Lerdorf izleyicilere, Ubuntu Linux işletim sistemi çalıştıran temel bir 1.8 GHz AMD Athlon CPU sağlayıcısı üzerinde zengin uygulama servis performansını nasıl optimize edebileceklerini de gösterdi.

PHP yaratıcısı, referans olarak başlangıçta default ayarları ile sadece saniyede 17 talebe cevap verebilen uygulama çalıştırma sürecini izleyicilere gösterdi.

Sunduğu optimizasyon süreci, sonunda aynı donanım aynı uygulamaları çalıştırdığı halde, saniyede 1,100 talebe yanıt verebiliyordu ve 10 mili-saniyeden kısa bir yanıt süresi ile çalışmaktaydı.

Lerdorf’un önerdiği kod analizi temelli performans iyileştirmelerinden birisi, veri-tabanı için PostgreSQL yerine MySQL kullanmaktı. Lerdorf

Eğer probleminizi MySQL’in halledebileceği bir boyuta indirgerseniz, çözüm çok hızlı olacaktır. Performansta da epeyce bir artış sağlarsınız.

diyor. MySQL’in, PostgreSQL kadar başarılı olamadığı problemler içinse Lerdorf, PHP’nin kendi içerisinde bazı özelliklerini taklit edilebileceklerini ve bu sayede yine net bir performans artışı elde edilebileceklarini belirtiyor.

Ayrıştırma ve derleme hızları da, opcode bir önbellek kullanımı ile hatırı sayılır oranlarda yükseltilebiliyor. Pek çok betikleme dilinde olduğu gibi PHP’de de kodlar insanların anladığı bir dil yapısından, makine dili yapısına çevrilmektedir. PHP’de makine-dilindeki betikler, opcodes olarak adlandırılır.

Opcode bir önbellek, derlenen kodu paylaşılan hafızada depolar veya bellekler ve bu sayede benzer işlemler için kod derlenmesine sadece bir kez ihtiyaç duyulmuş olur. Halen geliştirilmekte olan PHP 6, default olarak kurulu bir opcode önbelleğe sahip olacak.

Günümüz PHP 5 kullanıcıları için, aralarında Lerdorf’un da önerdiği Alternative PHP Cache’nin (Alternatif PHP Önbellek-APC) de bulunduğu çeşitli opcode önbellek uygulamaları mevcut. Lerdorf

Yahoo’daki her sunucuda [APC] mevcuttur ve APC günlük olarak milyarlarca talebe cevap veriyor.

diyor. PHP 5.2 ayrıca, Lerdorf’un kullanımının çok zor olduğunu belirttiği ve “çok karmaşık” olarak nitelediği SOAP’ı kullananlar dahil tüm geliştiricilerin Web servislerini geliştirmelerini ve konuşlandırmalarını kolaylaştırıyor.

“Basit” XML veri kullanımlarına olanak tanıyan bir PHP uzantısı olan SimpleXML ile, Web servislerinin karmaşıklığının büyük bir kısmı soyutlanabilir.

Lerdorf bir örnek olarak kendisinin yazdığı ve SimpleXML aracılığı ile veri çekebilen bir on-line RSS ayrıştırıcısını, sunumu esnasında seyircilere gösterdi.
Lerdorf sunumunu, PHP’nin SOAP aracılığı ile bile, bir Web servisi kadar kolay bir biçimde nasıl kullanılabileceğini göstererek sürdürdü.

Kaynak : http://turk.internet.com/haber/yazigoster.php3?yaziid=16458

Back To Top