<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Selçuk ÇELİK - back-end developer</title>
        <description>RSS Feed</description>
        <link>https://selcuk.org</link>
                                                    <item>
                    <title>Laravel&#039;de Özel Sayfalama Nasıl Yapılır?</title>
                    <description><![CDATA[Varsayılan olarak laravel'de sayfalama işlemleri bootstrap css çatısı altında yapılmaktadır ve buna uyumludur. Buraya kadar hiç bir sorun yok fakat işi bilmeyen hem müşteri, front-end(pardon hakaret oldu, dökümcü arkadaşlar diyecektim) işi yapan arkadaşlardan ötürü dökümler Allah'a emanet oluyor ve buda benim gibi arka plan(back-end) geliştiricilerinin küfür dağarcığını geliştirmelerine yardımcı oluyor. Buradan bunu sağlayan arkadaşlarımıza teşekkürü bir borç bilirim. Şimdi böyle çöp bir dökümde bizim gibi arkadaşlar laravel ile çalışıyorsa mecburen sayfalama işlemlerini buna uygun yapmak zorundadır veyahut yeni bir sınıf yazarak laravel projesine dahil edecektir. Benim blog için kullandığım html temada da bu sorundan müzdariptim ve çözümü en sağlıklısı olarak varsayılan pagination view dosyalarını yayınlayıp onun üzerinden düzenlemeler yaptım. Buna <b>laravel custom pagination view</b> denmektedir.<br><br>İlk önce terminalden artisan yardımıyla laravel paginate için kullandığı varsayılan blade dosyalarını projemizde gösterelim. Komut çalıştığında dosyalar <b><u>resources/views/vendor/</u></b> altına yerleşektir.<br><div class="highlighter-rouge"><pre><code>﻿﻿php artisan vendor:publish --tag=laravel-pagination</code></pre></div><br>Bu işlem sonucunda dizin altında ﻿<b>bootstrap-4.blade.php </b>dosyası oluştu. Bu bizim laraveldeki kullanılan varsayılan sayfalama blade dosyasıdır. Şimdi içerideki değerler ile kendi css yapımıza uygun blade yapısı oluşturabiliriz. Route içinde yada controller içinde aldığımız içerikleri örnek olarak vereceğim şekilde sayfalamasını yapmış olup view dosyamıza gönderiyoruz. Buradaki 5 değeri o an sayfadaki gösterilen içerik sayısıdır.<br><div class="highlighter-rouge"><pre><code>﻿﻿$contents = Model::orderBy('id', 'desc')->paginate(5);<br>return view('view-name', compact('contents'));</code></pre></div><br>Görüldüğü üzere $contents değişkenimizi view-name.blade.php dosyamıza aktarımını gerçekleştirdik. Buraya kadar her şey tamam ise view içerisinde bunu normal şartlarda <b> {{ $contents->links()  }}</b> kullanıyorduk şimdi örnek olarak <b><u>resources/views/vendor/pagination</u></b> klasörü içerisinde <b>selcuk.blade.php</b> adı altında bir sayfalama blade dosyası oluşturduğumu varsayarak view içerisinde bu şekilde kullanacağız.<br><div class="highlighter-rouge"><pre><code>{{ $contents->links('vendor.pagination.selcuk')  }}</code></pre></div><br>Yaptığımız işlemler bu kadardı ve başarıyla css yapımıza uygun bir sayfalama örneği elde etmiş olduk. Daha detaylı bilgilendirmeleri <a href="https://laravel.com/docs/5.6/pagination#customizing-the-pagination-view" target="_blank" title="bu" alt="https://laravel.com/docs/5.6/pagination#customizing-the-pagination-view">bu</a> sayfadan öğrenebilirsiniz. Paraya gerek yok bir Allah razı olsun yeter :)]]></description>
                    <pubDate>Tue, 05 Feb 2019 12:17:24 GMT</pubDate>
                    <link>https://selcuk.org/blog/laravel-de-ozel-sayfalama-nasil-yapilir</link>
                    <author>Selçuk Çelik</author>
                    <guid isPermaLink="true">https://selcuk.org/blog/laravel-de-ozel-sayfalama-nasil-yapilir</guid>
                </item>
                                            <item>
                    <title>Laravel&#039;de Çoklu Yetkilendirme(Authorization) İşlemleri</title>
                    <description><![CDATA[Normal şartlarda laravel sabit kimlik doğrulamasına sahiptir. Bunun ile birlikte yönetici ve kullanıcılar aynı kimlik yönetimi ile yönetilebilmektedir. Peki şimdi şu soruyu sorabilirsiniz; "O zaman neden buna ihtiyacımız olucak?" Aslında buna çok ihtiyacımız yok, bu gibi durumda User modeli üzerinde <b>hasRole() </b> methodu ile farklı kimlikleri ayrıştırıp ona göre gösterim işlemlerimizi yapabiliyoruz fakat ben bunu yapmak istemiyorum ve ﻿"<b>benim g.tüm kalkık abi, ben üyeler ile aynı tabloda olacak adam mıyım</b>" diyorsan doğru makaleyi okuyorsun demektir cancağızım. Şimdi burada yapacağımız işlemler laravelde <u>custom authentication</u> olarak adlandırılmaktadır.  Şimdi anahtar kelimemizide konuya dahil edip, bugünlük yapmamız gereken seo çalışmamızı da yapmış olmamın verdiği heyecan ile bismillah deyip işlemlere birlikte geçelim. Ben burada yönetici olarak custom authentication oluşturacağım. Siz daha fazla kimlik doğrulama isterseniz buradaki adımları çoğaltarak kullanabilirsiniz.<br><br>İlk işlem olarak eğer laravel projemizde doğrulama(auth) işlemlerinin iskelet yapılandırmasını yapmadı isek onu yapıyoruz. Bu işlemi daha önce yaptıysan es geçebilirsin burayı.<br><div class="highlighter-rouge"><pre><code>php artisan make:auth</code></pre></div><br>Şimdi ise ilk olarak veritabanı ile bağlantı kuracak olan model yapımızı artisan yardımıyla oluşturuyoruz.<br><div class="highlighter-rouge"><pre><code>php artisan make:model Admin -m</code></pre></div><br>Modelimiz oluştu ve içeriğinde gerekli olan alanları dolduruyoruz. Ben User modelini kopya ederek gerekli alanları ayarlamıştım.<br><div class="highlighter-rouge"><pre><code>namespace App;<br><br>use IlluminateNotificationsNotifiable;<br>use IlluminateContractsAuthMustVerifyEmail;<br>use IlluminateFoundationAuthUser as Authenticatable;<br><br>class Admin extends Authenticatable<br>{<br>    use Notifiable;<br><br>    protected $guarded = 'admin';<br><br>    protected $table = 'admins';<br><br>    /**<br>     * The attributes that are mass assignable.<br>     *<br>     * @var array<br>     */<br>    protected $fillable = [<br>        'name', 'email', 'password',<br>    ];<br><br>    /**<br>     * The attributes that should be hidden for arrays.<br>     *<br>     * @var array<br>     */<br>    protected $hidden = [<br>        'password', 'remember_token'<br>    ];<br><br>    public $timestamps = false;<br>}</code></pre></div><br>Modelimiz ile şimdilik işimiz bittikten sonra migration ile admins tablomuzu oluşturabiliriz veya iskelet yapımızı kurduğumuzda oluşan users migration ile kolayca türetebiliriz. Üşendim ben derseniz buradan dosyayı veriyorum. Dosyayı oluşturduktan sonra terminalden <b>php artisan make migration</b> komutunu çalıştırıp tabloyu da oluşturuyoruz.<br><div class="highlighter-rouge"><pre><code>use IlluminateSupportFacadesSchema;<br>use IlluminateDatabaseSchemaBlueprint;<br>use IlluminateDatabaseMigrationsMigration;<br><br>class CreateAdminsTable extends Migration<br>{<br>    /**<br>     * Run the migrations.<br>     *<br>     * @return void<br>     */<br>    public function up()<br>    {<br>        Schema::create('admins', function (Blueprint $table) {<br>            $table->increments('id');<br>            $table->string('name');<br>            $table->string('email');<br>            $table->string('password');<br>            $table->rememberToken();<br>        });<br>    }<br><br>    /**<br>     * Reverse the migrations.<br>     *<br>     * @return void<br>     */<br>    public function down()<br>    {<br>        Schema::dropIfExists('admins');<br>    }<br>}</code></pre></div><br>Şimdi model dosyamız ve tablomuz kurulu olduğuna göre laraveldeki middleware yapılarına yani controller ile view arasındaki ara katmanımız için gerekli kimlik bilgilerini tanıtacağız. Proje dizininde bulunan <b>config/auth.php</b> dosyasını açıyoruz ve guards, providers kısımlarını düzeltiyoruz.<br><div class="highlighter-rouge"><pre><code>'guards' => [<br>        'web' => [<br>            'driver' => 'session',<br>            'provider' => 'users',<br>        ],<br><br>        'api' => [<br>            'driver' => 'token',<br>            'provider' => 'users',<br>        ],<br><br>        'admin' => [<br>            'driver' => 'session',<br>            'provider' => 'admins',<br>        ],<br><br>        'admin-api' => [<br>            'driver' => 'token',<br>            'provider' => 'admins',<br>        ],<br>    ],<br><br>'providers' => [<br>        'users' => [<br>            'driver' => 'eloquent',<br>            'model' => AppUser::class,<br>        ],<br><br>        'admins' => [<br>            'driver' => 'eloquent',<br>            'model' => AppAdmin::class,<br>        ],<br>    ],</code></pre></div><br>Ayarlamamızı yaptıktan sonra yönetici(admin) girişi için view işlemizde form kısmını bu şekilde düzenliyoruz. Kullanıcı girişiyle aynı olduğu için o formun aynısını kopyaladım sadece gerekli alan action kısmı düzelttim. Buradaki dikkat etmeniz gereken en önemli şey ise belirttiğimiz route isminin sende de olması yada senin bunu düzeltmendir.<br><div class="highlighter-rouge"><pre><code>&lt;form id=&quot;admin_login&quot; method=&quot;POST&quot; action=&quot;{{ route('admin.login.submit') }}&quot;&gt;<br>    @csrf<br>    &lt;div class=&quot;input-group&quot;&gt; &lt;span class=&quot;input-group-addon&quot;&gt; &lt;i class=&quot;zmdi zmdi-account&quot;&gt;&lt;/i&gt; &lt;/span&gt;<br>        &lt;div class=&quot;form-line&quot;&gt;<br>            &lt;input type=&quot;email&quot; class=&quot;form-control&quot; name=&quot;email&quot; placeholder=&quot;E-Posta Adresi&quot; value=&quot;{{ old('email') }}&quot; required autofocus&gt;<br>        &lt;/div&gt;<br>        @if ($errors-&gt;has('email'))<br>        &lt;span class=&quot;text-danger&quot;&gt;&lt;strong&gt;{{ $errors-&gt;first('email') }}&lt;/strong&gt;&lt;/span&gt;<br>        @endif<br>    &lt;/div&gt;<br><br>    &lt;div class=&quot;input-group&quot;&gt; &lt;span class=&quot;input-group-addon&quot;&gt; &lt;i class=&quot;zmdi zmdi-lock&quot;&gt;&lt;/i&gt; &lt;/span&gt;<br>        &lt;div class=&quot;form-line&quot;&gt;<br>            &lt;input type=&quot;password&quot; class=&quot;form-control&quot; name=&quot;password&quot; placeholder=&quot;Şifre&quot; required&gt;<br>        &lt;/div&gt;<br>    &lt;/div&gt;<br>    &lt;div&gt;<br>        &lt;div class=&quot;&quot;&gt;<br>            &lt;input type=&quot;checkbox&quot; name=&quot;remember&quot; {{ old('remember') ? 'checked' : '' }} id=&quot;rememberme&quot; class=&quot;filled-in chk-col-pink&quot;&gt;<br>            &lt;label for=&quot;rememberme&quot;&gt;Beni Hatırla&lt;/label&gt;<br>        &lt;/div&gt;<br>        &lt;div class=&quot;text-center&quot;&gt;<br>            &lt;button type=&quot;submit&quot; class=&quot;btn btn-raised waves-effect g-bg-cyan&quot;&gt;Giriş Yap&lt;/button&gt;<br>        &lt;/div&gt;<br>    &lt;/div&gt;<br>&lt;/form&gt;</code></pre></div><br>Şimdi view dosyamızı oluşturduk ama bunun bir controller dosyası da olmalı ki elini kolunu sallayan herkes yönetici sayfamıza erişemesin. Terminale <b>php artisan make:controller Admin/Admin</b> yazarak Admin controller dosyamızı oluşturuyoruz ve içeriğini böyle düzenliyoruz.<br><div class="highlighter-rouge"><pre><code>namespace AppHttpControllersAdmin;<br><br>use AppHttpControllersController,<br>    AppSetting,<br>    IlluminateSupportFacadesValidator,<br>    IlluminateHttpRequest,<br>    IlluminateSupportFacadesAuth,<br>    IlluminateSupportFacadesHash;<br><br>class Admin extends Controller<br>{<br>    /**<br>     * Create a new controller instance.<br>     *<br>     * @return void<br>     */<br>    public function __construct()<br>    {<br>        $this->middleware('auth:admin');<br>    }<br><br>    /**<br>     * Show the application dashboard.<br>     *<br>     * @return IlluminateContractsSupportRenderable<br>     */<br>    public function index()<br>    {<br>        return view('admin.dashboard');<br>    }<br><br>    public function logout(Request $request)<br>    {<br>        Auth::guard('admin')->logout();<br>        $request->session()->flush();<br>        $request->session()->regenerate();<br>        return redirect()->guest(route('admin.login'));<br>    }<br>}<br></code></pre></div><br>Tamam yönetici sayfamız için gerekli controller oluşturduk fakat login işlemleri için de controller ihtiyacımız var hemen terminalden <b>php artisan make:controller Admin/AdminLogin</b> çalıştırıyoruz. Ve içeriğini düzenliyoruz.<br><div class="highlighter-rouge"><pre><code><?php<br><br>namespace AppHttpControllersAdmin;<br><br>use IlluminateHttpRequest;<br>use AppSetting;<br>use AppHttpControllersController;<br>use IlluminateSupportFacadesAuth;<br><br>class AdminLogin extends Controller<br>{<br>    public function __construct()<br>    {<br>        $this->middleware('guest:admin');<br>    }<br><br>    public function login()<br>    {<br>        $setting = Setting::find(1);<br>        return view('admin.login', compact('setting'));<br>    }<br><br>    public function loginForm(Request $request)<br>    {<br>        $this->validate($request, [<br>            'email'         => 'required|email',<br>            'password'      => 'required'<br>        ]);<br><br>        if (Auth::guard('admin')->attempt(['email' => $request->email, 'password' => $request->password], $request->remember))<br>        {<br>            return redirect()->intended(route('admin.dashboard'));<br>        }<br><br>        return redirect()->back()->withInput($request->only('email', 'remember'));<br>    }<br>}<br></code></pre></div><br>Yazmaktan yoruldum vallahi ama senin değer cancağızım. Şimdi route işlemlerini yapıyoruz. Bunun için proje dizininde <b>routes/web.php</b> dosyamızı açıyoruz. Ve en altına bu yönlendirmeleri ekliyoruz. Burada route group methodundan yararlandık çünkü sürekli admin, admin yazmaktansa group içinde belirttik ona ait işlemleri.<br><div class="highlighter-rouge"><pre><code>Route::group(['prefix' => 'admin'], function() {<br>    # Login Page<br>    Route::get('/login', 'AdminAdminLogin@login')->name('admin.login');<br><br>    # Login POST Page<br>    Route::post('/login', 'AdminAdminLogin@loginForm')->name('admin.login.submit');<br><br>    # Admin Dashboard<br>    Route::get('/', 'AdminAdmin@index')->name('admin.dashboard');<br><br>    # Admin Logout<br>    Route::post('/logout', 'AdminAdmin@logout')->name('admin.logout');<br>});</code></pre></div><br>Şimdiye buraya kadar her şey tamamsa kardeşim, ilk olarak <b>IlluminateFoundationExceptionsHandler</b> sınıfımıza ulaşıp <b>unauthenticated()</b> methodumuzu bu şekilde değiştiriyoruz. Bu doğru middleware yönlendirmeleri için gerekli kısımdır. Bu kısımda dikkat etmemiz gereken nokta ise route isimlerini doğru girmemiz olucaktır yoksa hata alırız.<br><div class="highlighter-rouge"><pre><code>protected function unauthenticated($request, AuthenticationException $exception)<br>    {<br>        if ($request->expectsJson()) {<br>            return response()->json(['error' => 'Unauthenticated.'], 401);<br>        }<br>        $guard = array_get($exception->guards(), 0);<br>        switch ($guard) {<br>            case 'admin':<br>                $login = 'admin.login';<br>                break;<br>            default:<br>                $login = 'login';<br>                break;<br>        }<br>        return redirect()->guest(route($login));<br>    }</code></pre></div><br>Son olarakta başarılı şekilde kimliğimi doğrulandıktan sonra middleware abimizin bizi doğru sayfaya tükürmesini sağlayacak ayarlarını <b>app/Http/Middleware/RedirectIfAuthenticated.php</b> dosyasında handle methodunu düzenleyerek yapıyoruz. Az önceki düzenlemede söylediğim gibi burada dikkat etmemiz gereken can alıcı nokta route isimlerinin doğru bir şekilde ayarlanmasıdır.<br><div class="highlighter-rouge"><pre><code>public function handle($request, Closure $next, $guard = null)<br>    {<br>        switch ($guard) {<br>            case 'admin':<br>                if (Auth::guard($guard)->check()) {<br>                    return redirect()->route('admin.dashboard');<br>                }<br>                break;<br>            default:<br>                if (Auth::guard($guard)->check()) {<br>                    return redirect('/');<br>                }<br>                break;<br>        }<br>        return $next($request);<br>    }</code></pre></div><br>Her şey bu kadar cancağızım. Benim bu işlemleri anlayıp ve geliştirmemi sağlayan <a href="https://www.youtube.com/channel/UC6kwT7-jjZHHF1s7vCfg2CA" target="_blank" title="DevMarketer" alt="https://www.youtube.com/channel/UC6kwT7-jjZHHF1s7vCfg2CA">DevMarketer</a> kanalındaki J. Alexander Curtis abimize teşekkürlerimizi sunuyoruz.]]></description>
                    <pubDate>Mon, 04 Feb 2019 00:08:54 GMT</pubDate>
                    <link>https://selcuk.org/blog/laravel-de-coklu-yetkilendirme-authorization-islemleri</link>
                    <author>Selçuk Çelik</author>
                    <guid isPermaLink="true">https://selcuk.org/blog/laravel-de-coklu-yetkilendirme-authorization-islemleri</guid>
                </item>
                                            <item>
                    <title>Laravel Public To Public_html İşlemi</title>
                    <description><![CDATA[Dünyada en çok kullanılan web hosting panel olan cPaneldir. Ben de dahil onu kullanmaktayım. cPanel sabit(default) olarak yayını <b>public_html</b> klasöründen yapmaktadır. Hal böyle olunca Laravel projelerinin yayın klasörü sabit olarak <b>public</b> klasörü ortaya ufak bir sorun çıkmaktadır. Peki bu durumda "Aman Allah'ım, öldük geberdik" mi diyeceğiz yoksa bir çözümü var mı? Evet var. Laravelde sık çalışıyorsanız bu yazı size göre değil çünkü zaten çözümü biliyorsunuzdur. Burada yeni laravel projeleri oluşturmaya çalışan arkadaşları hedef alarak bu yazıyı yazıyorum. Gene çenem düştü lafı gereksizce uzattım, her neyse hemen basit bir yolla bu sorunumuzu çözelim.<br><br>Bu işlemi yaptığımız kısım <b><u>AppServiceProvider</u></b> kısmındaki <b><span style="color: #ff0000">register()</span></b> methodudur.. Bu dosyaya ise ﻿<b><u><span style="color: #ff0000">AppProvidersAppServiceProvider</span></u></b> yolunu izleyerek ulaşıyoruz ve karşımıza şak diye register methodu çıkıyor. Şimdi aşağıdaki fonksiyon ile register fonksiyonunu değiştiriyoruz ve sorumuzu çözmüş oluyoruz.<br><div class="highlighter-rouge"><pre><code>public function register()<br>{<br>    // public to public_html<br>    $this->app->bind('path.public', function() {<br>        return base_path('public_html');<br>    });<br>}</code></pre></div>]]></description>
                    <pubDate>Tue, 29 Jan 2019 14:46:36 GMT</pubDate>
                    <link>https://selcuk.org/blog/laravel-public-to-public-html-islemi</link>
                    <author>Selçuk Çelik</author>
                    <guid isPermaLink="true">https://selcuk.org/blog/laravel-public-to-public-html-islemi</guid>
                </item>
                                            <item>
                    <title>PHP&#039;de File Cache Nasıl Yapılır</title>
                    <description><![CDATA[Bu yazıda eski blog adresimdeki olan ve GitHub'da paylaştığım bir sınıfım ile alakalı. Bu sınıfı 14 Nisan 2015 tarihinde yazıp GitHub adresime yüklemişim ve üzerinden neredeyse 4 yıl geçmiş. Zaman çok çabuk geçtiğini bunları görünce anlıyorum. Şimdi sorabilirsiniz, neden 4 yıl önceki paylaştığın bir sınıfı yıl olmuş 2019 paylaşıyorsun. Çünkü halen kullanan kişiler olduğunu biliyorum ve PHP 8 bile gelse hiç yarı yolda bırakmayacağını biliyorum. Mazimizi canlandırdığımıza göre sınıfı anlatayım biraz.<br><br><span style="font-size: 150%"><b>﻿﻿sCache Sınıf Kullanımı</b></span><br>Cache ayarları opsiyoneldir, boş bırakılırsa sabit(default) değerler geçerli sayılacaktır. Comment şeklinde default değerler verilmiştir. Daha ne yapayım söyle :)<br><div class="highlighter-rouge"><pre><code>/*  settings();<br>    sCache::settings(array(<br>        '_path' => 'cache',<br>        '_name' => 'default',<br>        '_extension' => 'scache'<br>    ));<br> */<br><br>// Örnek<br>sCache::settings(array(<br>    '_path' => 'cache',<br>    '_name' => 'cache',<br>    '_extension' => '.selco'<br>));</code></pre></div><br>Şimdi cache tanımlamasını göstereyim, belirlediğimiz anahtar ile daha sonradan istediğimizi veriye ulaşabileceğiz.<br><div class="highlighter-rouge"><pre><code>/*  setCache();<br>    sCache::setCache($key, $data, $writing = FALSE);<br>    NOT: Daha önce tanımlanmış bir cache üstüne yazmak için $writing değeri TRUE yapınız.<br> */<br><br>// Örnek<br>try {<br><br>    $boolean = sCache::setCache('test', 'test içerik');<br>    echo ($boolean) ? 'cache tanımlandı.' : 'cache tanımlanamadı.';<br><br>} catch (Exception $e )<br>{<br>    echo $e->getMessage(); // Hata oluşursa ekrana yaz.<br>}</code></pre></div><br>Tanımlanan cache kaydına ulaşmak ise şöyle olmaktadır. Unutulmamalı ki <b>setCache()</b> içerisinde belirlediğimiz anahtarımız ile ulaşacağız.<br><div class="highlighter-rouge"><pre><code>/*  getCache();<br>    sCache::getCache($key);<br> */<br><br>// Örnek<br>try {<br><br>    $string = sCache::getCache('test');<br>    echo $string;<br><br>} catch (Exception $e )<br>{<br>    echo $e->getMessage(); // Hata oluşursa ekrana yaz.<br>}</code></pre></div><br>Bazen cache okumak yerine nerede olduğunu merak ederiz, yani ben öyle olduğum için onuda eklemiştim. Onu tespit etmeyi de böyle yapıyoruz.<br><div class="highlighter-rouge"><pre><code>/*  getCacheDir();<br>    sCache::getCacheDir($key);<br> */<br><br> // Örnek<br> try {<br><br>    $string = sCache::getCacheDir('test');<br>    echo $string;<br><br>} catch (Exception $e )<br>{<br>    echo $e->getMessage(); // Hata oluşursa ekrana yaz.<br>}</code></pre></div><br>Bazen manuel şekilde yada istemsizce bir cache dosyamız silinmiş olabilir, tabi onunda kontrolünü şöyle yapıyoruz.<br><div class="highlighter-rouge"><pre><code>/*  isCached();<br>    sCache::isCached($key);<br> */<br><br>// Örnek<br>try {<br><br>    $boolean = sCache::isCached('test');<br>    echo ($boolean) ? 'Cache var' : 'Cache yok';<br><br>} catch (Exception $e )<br>{<br>    echo $e->getMessage(); // Hata oluşursa ekrana yaz.<br>}</code></pre></div><br>Şimdi cache ile bir işimiz kalmadı ve ftp de boş bir alan kaplamasın istiyorsak onu da ahanda böyle yapıyoruz.<br><div class="highlighter-rouge"><pre><code>*  destroyCache();<br>    sCache::destroyCache($key);<br> */<br><br>// Örnek<br>try {<br><br>    $boolean = sCache::destroyCache('test');<br>    echo ($boolean) ? 'Cache silindi' : 'Cache silinemedi.';<br><br>} catch (Exception $e )<br>{<br>    echo $e->getMessage(); // Hata oluşursa ekrana yaz.<br>}</code></pre></div><br>Ben bu sınıfı kullanmak istemiyorum, nalet olsun senin sınıfınıda deyip tüm cache kayıtlarını silmek için şöyle bir kullanımı var.<br><div class="highlighter-rouge"><pre><code>/*  destroyAllCaches();<br>    sCache::destroyAllCaches();<br> */<br><br> // Örnek<br> try {<br><br>    $boolean = sCache::destroyAllCaches();<br>    echo ($boolean) ? 'Tüm kayıtlar silindi.' : 'Kayıtlar silinemedi.';<br><br>} catch (Exception $e )<br>{<br>    echo $e->getMessage(); // Hata oluşursa ekrana yaz.<br>}</code></pre></div><br>Gerekli olan şeylerin hepsini belirttim. Kullanıp kullanmamanız size kalmış fakat ben olsam kullanırdım. Bu sınıfı GitHub <a href="https://github.com/selcodiyebiri/sCache.Class.PHP" target="_blank" title="adres" alt="https://github.com/selcodiyebiri/sCache.Class.PHP">adres</a>imden veyahut verdiğim eklenti indirme yerinden edinebilirsiniz.]]></description>
                    <pubDate>Mon, 28 Jan 2019 14:31:17 GMT</pubDate>
                    <link>https://selcuk.org/blog/php-de-file-cache-nasil-yapilir</link>
                    <author>Selçuk Çelik</author>
                    <guid isPermaLink="true">https://selcuk.org/blog/php-de-file-cache-nasil-yapilir</guid>
                </item>
                                            <item>
                    <title>mySQL Yedek Alıp Yandex.Disk Yüklemek</title>
                    <description><![CDATA[Eski blog adresimde 16 Nisan 2014 yılında yazıp paylaştığım bir sınıfımın yazısını tekrar yazıyorum çünkü aradan 5 yıl geçmesine rağmen halen kullanılan bir sınıf olduğu için neden bunu yapmayayım değil mi? Şimdi bu sınıf <b>mySQLi</b> sınıfını kullanarak SQL yedeğinizi alıp Yandex.Disk'e webDAV bağlantısını kullanarak yüklemektedir. Tercih meselesi olarak ben SQL yedeklerimi sunucu haricinde ekstra yandexte tutmayım çünkü bilindiği gibi güvenlik delisi olduğum kadarda garanticiyimdir. Şimdi lafı daha da uzatmadan sınıfını tanıtayım.<br><br><b><span style="font-size: 150%">﻿sBackup.Class.PHP Nedir?</span></b><br>﻿mySQL yedeğinizi almaya ve Yandex.Disk hesabınıza upload etmeye yarayan gelişmiş özellikli bir sınıftır. Bunun sayesinde Cronjob ile otomatik olarak sitelerinizin yedeğini alabilir dilerseniz FTP ye veyahut Yandex.Disk adresinize kaydedebilirsiniz.<br><br><b><span style="font-size: 150%">﻿Sınıf Kullanımı</span></b><br><div class="highlighter-rouge"><pre><code>include "sBackup.class.php";<br><br># Veritabanına bağlanıyoruz.<br>$backup = new sBackup('localhost', 'user', 'password', 'dbname');<br><br># Yandex.Disk e upload edilmeyecek ise FALSE olmalıdır.<br># ﻿Default olarak FALSE değeri vardır.<br>$backup->yandexUpload = TRUE;<br><br># YandexUpload TRUE ise Yandex.Disk kullanıcı adımızı giriyoruz.<br>$backup->yandexUser = 'user';<br><br># YandexUpload TRUE ise Yandex.Disk kullanıcı adımızın şifresini giriyoruz.<br>$backup->yandexPassword = 'password';<br><br># YandexUpload TRUE ise Yandex.Disk içinde özel bir klasore kaydetmek istiyorsak onun adını giriyoruz.<br>$backup->yandexKlasor = 'backup';<br><br># SQL dosyalarımızın geçiçi veya kalıcı olarak kaydedileceği klasor adıdır.<br># ﻿Default olarak tmp/ klasoru adındadır.<br>$backup->cacheKlasoru = 'backup/';<br><br># Sunucuya kaydedilen .sql dosyasının silinip silinmeyeceğini belirler.<br># ﻿Default olarak FALSE değerindedir.<br># YandexUpload FALSE ise bu değer siz TRUE belirleseniz bile FALSE olarak işlem yapacaktır.<br>$backup->cacheFilesDelete = TRUE;<br><br># Değer FALSE olur ise dosyanın yükleneceği veritabanı içinde benzer tablo adları bulunmamalıdır.<br># ﻿Default olarak TRUE değerindededir<br>$backup->dropTable = FALSE;<br><br># Tabloların yedeklendiği fonksiyondur. Boş bırakılır ise tüm tabloları kaydedecektir.<br># Eğer tek bir tabloyu kaydetmesini isterseniz dizi halinde tablo isimlerini gönderebilirsiniz.<br># ﻿$backup->Backup(array('tablo', 'tablo2')); gb.<br>$backup->Backup();</code></pre></div><br>Dip Not: Sınıf mySQL veritabanına ulaşmak için mySQLi kullandığından ötürü php sürümü PHP 5.x ve üstü olmalıdır. Github adresimden indirmek isteyenler <a href="https://github.com/selcodiyebiri/sBackup.Class.PHP" target="_blank" title="bu" alt="https://github.com/selcodiyebiri/sBackup.Class.PHP">bu</a> linkten indirebilirler. İsteyenler direk alt kısımda ek olarak sunduğum yerden indirebilirler.]]></description>
                    <pubDate>Mon, 28 Jan 2019 14:13:13 GMT</pubDate>
                    <link>https://selcuk.org/blog/mysql-yedek-alip-yandex-disk-yuklemek</link>
                    <author>Selçuk Çelik</author>
                    <guid isPermaLink="true">https://selcuk.org/blog/mysql-yedek-alip-yandex-disk-yuklemek</guid>
                </item>
                                            <item>
                    <title>Centos 7&#039;ye PHP Memcached Kurulumu ve Kullanımı</title>
                    <description><![CDATA[Memcached, öncelikle veritabanlarını yoğun şekilde kullanan siteleri hızlandırmak için kullanılan, dağıtılmış, yüksek performanslı, bellek içi önbellekleme sistemidir. Bunun yanında her türlü bilgiyi saklamak içinde kullanılır. Yoğun işlem gerektiren her projede bu sınıfı kullandığım için bunun kurulumunu CentOS 7 için bahsedeceğim. İlerleyen zamanlarda diğer sistemler için kurulumlarını da paylaşmayı düşünüyorum. Şimdi konumuza dönecek olursak, neredeyse her popüler CMS sistemleri  memcached'den yararlanmak için bir eklenti veya modüle sahiptir çünkü memcached  birçok programlama dili PHP, Perl, Ruby ve Python dahil <b>memcached</b> kütüphanesine sahiptir. Memcached bellekte çalışır ve diske veri yazmak zorunda olmadığından oldukça hızlıdır.<br><br><span style="font-size: 150%"><b>Kurulum Öncesi Bilinmesi Gerekenler;</b></span><br><ul><li>Kurulum sadece CentOS 7 için anlatılmıştır.<br></li><li>Bu işlemler için kuracağınız makinada root yetkisine sahip olmalısınız.</li></ul><br>Makinedeki var olan güncellemeleri öncellikle bir yapmamız gerekiyor çünkü memcached sunucuzdaki var olan bir kaç bileşeni kullanacağı için sıkıntı yaşamamız gerekiyor.<br><div class="highlighter-rouge"><pre><code>yum -y update *</code></pre></div><br>Daha sonra makinamıza tek bir komutla memcached için gerekli olan her şeyi kuruyoruz.<br><div class="highlighter-rouge"><pre><code>yum -y install php-pecl-memcache</code></pre></div><br>Kurulum tamamlandıktan sonra şimdi yazacağımız komutla memcached doğru kurulup kurulmadığını kontrol etmek adına memcached yeniden başlatıyoruz.<br><div class="highlighter-rouge"><pre><code>systemctl restart memcached<br>systemctl restart httpd</code></pre></div><br>Daha sonra herseyini düzgün olup olmadığının kontrolü için php'deki kurulu olan modülleri gösteriyoruz.<br><div class="highlighter-rouge"><pre><code>php -m | grep memcache</code></pre></div><br>Eğer listenen içerisinde memcache görüyor isek başarıyla kurmuşuz demektir. <br><br>Şimdi örnek olarak bir anahtar belirleyip bazı değişkenlerimi bellekte tutmayı gösterelim. Ben bu örnek için mySQL'den aldığımız bir veriyi tutmayı gösteriyorum.<br><div class="highlighter-rouge"><pre><code># PDO, mySQL Baglantisi<br>try {<br>    $db = new PDO('mysql:host=localhost;dbname=dbname', 'user', 'pass');<br>} catch (PDOException $e) {<br>    echo 'Baglanti Hatasi: ' . $e->getMessage();<br>}<br><br># MemCache ile MemCached Sunucusuna Baglan<br>$memcache = new Memcache;<br>$memcache->connect('127.0.0.1', 11211) or die ("Sunucuya Baglanilamiyor...");<br><br># Üyeler tablosuna baglanip statu 1 olanlari listesini aliyoruz<br>$uyeler = $db->prepare('SELECT * FROM uyeler WHERE statu = :statu');<br>$uyeler->bindValue(':statu', 1, PDO::PARAM_INT); <br>$uyeler->execute();<br>$uyeler->fetchAll(PDO::FETCH_OBJ);<br><br># Bos bir dizi olusturuyoruz<br>$veriDizisi = [];<br>foreach ($uyeler as $uye)<br>{<br>   # Üyelerin kullanici adini döngüde diziye ekliyoruz<br>   $veriDizisi[] = $uye->kullaniciAdi;<br>}<br><br># MemCache ile Anahtar Belirliyoruz.<br># 1800 sn bazindadir ve 30 dk ya denk gelmektedir.<br>$memcache->set('uyeBilgileri', $veriDizisi, false, 1800);</code></pre></div><br>Çok güzel bir şekilde <b>uyeBilgileri</b> anahtarını belirleyerek memcached içerisinde bir dizi tuttuk. Şimdi bu anahtara ulaşmayıda gösterip yazıyı sonlandırıyorum.<br><div class="highlighter-rouge"><pre><code># MemCache ile MemCached Sunucusuna Baglan<br>$memcache = new Memcache;<br>$memcache->connect('127.0.0.1', 11211) or die ("Sunucuya Baglanilamiyor...");<br><br># Olusturulan Anahtara Ulasma<br>$uyeBilgileri = $memcache->get('uyeBilgileri');<br>if ($uyeBilgileri === true)<br>   print_r($uyeBilgileri);</code></pre></div><br><b>Ek Not:</b> MemCached sunucunda en fazla veri saklama boyutu 1 MB'dir. Bundan ötürü cok büyük bir veri önbellege alinacak ise set edilirken <b>FALSE</b> degeri <span style="color: #ff0000"><b>TRUE</b></span> olmalidir.]]></description>
                    <pubDate>Mon, 28 Jan 2019 13:15:12 GMT</pubDate>
                    <link>https://selcuk.org/blog/centos-7-ye-php-memcached-kurulumu-ve-kullanimi</link>
                    <author>Selçuk Çelik</author>
                    <guid isPermaLink="true">https://selcuk.org/blog/centos-7-ye-php-memcached-kurulumu-ve-kullanimi</guid>
                </item>
                                            <item>
                    <title>Domain Değişikliği</title>
                    <description><![CDATA[Yaklaşık olarak 2013 yılından beri <s><b>selcuk.in</b></s> domainimde devam ediyordum. Şimdilerde <b><a href="https://selcuk.org/" target="_blank" title="selcuk.org" alt="https://selcuk.org/">selcuk.org</a></b> domaini aldığım için artık blog yayın hayatına bu domainde yeni makaleler paylaşarak devam edeceğim. Bakıyordum da eski blogumda 6 yıldır çok az paylaşım bulunmuşum. Bunu sıklaştırmak için ve yeni domain şerefine var olan eskiyen alt yapıyı ve temamı değiştirmeye karar verdim. Normalde gerek görmediğim halde çatı(framework) bilgimi tazelemek adına şu anki sistemimi Laravel 5.7 ile yazdım. İlerleyen yazılarımda son versiyonunu ve kaynakların az olduğunu düşündüğüm Laravel hakkında can kurtarıcı bilgiler paylaşacağım. Bunların yanında önemli olduğunu düşündüğüm herseyide paylaşmayı düşünüyorum. Son olarak yazımı klasikleşmiş fakat hiç eskimeyen bir giriş ile bitiriyorum.<br><br><div class="highlighter-rouge"><pre><code>echo 'merhaba dünya';</code></pre></div>]]></description>
                    <pubDate>Sun, 27 Jan 2019 19:42:33 GMT</pubDate>
                    <link>https://selcuk.org/blog/domain-degisikligi</link>
                    <author>Selçuk Çelik</author>
                    <guid isPermaLink="true">https://selcuk.org/blog/domain-degisikligi</guid>
                </item>
                        </channel>
</rss>