Categories: PHPTips Trik

Fungsi berguna yang sering dipakai di PHP

Bismillaahirrohmaanirrohiim…

Di bawah ini adalah fungsi yang berguna di PHP yang sering dipakai oleh programmer PHP.

Generate uniq ID

Biasanya di database MySQL programmer suka menggunakan autoincrement untuk primary key-nya, namun masalahnya akan muncul saat syncronisasi data dari beberapa database backup, karena bisa jadi nilai primary-nya sama.
Sebagai solusinya, programmer membuat sendiri fungsi yang menandai ID primary key benar-benar unik.

function getId() {
  $idt = explode(" ", microtime());
  $uniqid = $idt[1]. substr($idt[0], 2);
  return $uniqid.rand(1000,9999);
}
//hasil contoh: 1618802094566629001421 (22 digit)

atau

function getId() {
  return uniqid(rand(1000,9999),true);
  //tanpa titik
  //return str_replace('.', '', uniqid(rand(100,999),true));
}

//hasil contoh: 7408607ce1535575e0.35457382 (27 digit)

fungsi di atas bisa jadi masih berpotensi menghasilkan kode yang sama, silahkan ubah random angkanya sesuai kebutuhan.

Menampilkan teks saat kode dijalankan

Saat menjalankan program PHP, biasanya teks baru akan ditampilkan setelah kode pada file tersebut selesai dieksekusi.
Nah, untuk menampilkan text tanpa menunggu kode selesai diekseskusi fungsinya adalah sebagai berikut:

function print_cmd($txt) {
    echo $txt;

    @ob_end_flush();
    @ob_flush();
    flush();
    ob_start();
}

Menunggu user input saat php CLI dijalankan

function wait_user_input() {
    $handle = fopen ("php://stdin","r");
    $line = fgets($handle);
    fclose($handle);
    
    return trim($line);
}

Host tidak sama dengan domain kita

Jika kita punya website dengan IP address private, semua domain dapat diarahkan ke IP website kita.
Sehingga jika ada orang iseng membuat nama domain lain kemudian diarahkan ke IP website kita, jadinya web kita mempunyai banyak alamat website.
Contoh, IP server kita 123.123.123.123 bisa untuk domain webku.com, webmu.com, webkita.com dengan tampilan yang sama.
Agar setiap domain yang diarahkan ke IP server menjadi benar-benar domain milik kita, fungsinya adalah sbb:

if (strtolower($_SERVER['HTTP_HOST']) !== 'namadomainku.com') {
  header('location:https://namadomainku.com'.$_SERVER['REQUEST_URI']);
  exit();
}

Echo pre

Untuk memudahkan membaca array, daripada var_dump hehehe

function echoPre($arr) {
  echo '<pre>';
  print_r($arr);
  echo '</pre>';
}

Teks menjadi slug

Tujuan sudah jelas, agar link kita sesuai judul berita sehingga disukai search engine.

function textToSlug($text='') {
  $text = trim($text);
  if (empty($text)) return '';

    $text = preg_replace("/[^a-zA-Z0-9\-\s]+/", "", $text);
    $text = strtolower(trim($text));
    $text = str_replace(' ', '-', $text);
    $text = $text_ori = preg_replace('/\-{2,}/', '-', $text);

    return $text;
}

Slug menjadi text

Kebalikan dari teks menjadi slug, dari URL menjadi teks yang mudah dibaca manusia.

function slugToText($slug='') {
  $slug = trim($slug);
  if (empty($slug)) return '';

    $slug = str_replace('-', ' ', $slug);
    $slug = ucwords($slug);
    return $slug;
}

simpan html yang ditampilkan kedalam teks

Ini biasa dipakai saat ingin cache full page, beberapa plugin cache wordpress konsepnya dia membuat file statis (txt, html, dll) berdasarkan URL, jika sudah disimpan dalam cache saat ada akses ke URL tersebut tidak perlu query macem-macem, tinggal ambil dari cache yang disimpan tersebut.
berikut ini cara menyimpan teks, html, css, javascript ke dalam file statis.

$cached_file = dirname(__FILE__).'/cache/namacache.html';
ob_start();
//teks/html/css/javascript
@file_put_contents($cached_file, ob_get_contents());

Redirect http ke https dengan PHP

Kode di bawah ini  bisa digunakan untuk wordpress maupun untuk web PHP pada umumnya. Contoh ini jika dipakai di wordpress terbaru.

<?php
$host_http = 'yourdomain.com';

if (!isset($_SERVER['HTTP_HOST'])) $_SERVER['HTTP_HOST'] = $host_http;
if (!isset($_SERVER['REQUEST_URI'])) $_SERVER['REQUEST_URI'] = '';

if (strtolower($_SERVER['HTTP_HOST']) !== $host_http) {
  header('location:https://'.$host_http.$_SERVER['REQUEST_URI']);
  exit();
}

$protocol_web = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS']!=='off') || $_SERVER['SERVER_PORT']==443) ? 'https://':'http://';

if ($protocol_web==='http://') {
  header('location:https://'.$host_http.$_SERVER['REQUEST_URI']);
  exit();
}
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */
/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */define( 'WP_USE_THEMES', true );

/** Loads the WordPress Environment and Template */require( dirname( __FILE__ ) . '/wp-blog-header.php' );

Set timezone asia jakarta

ini_set('date.timezone','Asia/Jakarta');
//bisa juga ditambahkan dibawahnya
date_default_timezone_set("Asia/Jakarta");

Mengambil nama file yang sedang diakses

//misal url = https://namadomain/blog/proses-data.php
basename(__FILE__, '.php');
output: proses-data

basename(__FILE__);
output: proses-data.php

Cek JSON valid atau tidak

$array = json_decode($json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    echo 'json not valid';
} else {
    echo 'json valid';
}

Hapus tag HTML dan isinya dengan PHP

<?php
//menghapus semua tag <table> tanpa property dan isinya
$html = preg_replace('#<table>(.*?)</table>#is', '', $html);

//menghapus semua tag <tr> yang mempunyai class dimulai "tebal"
$html = preg_replace('#<tr class=\"tebal(.*?)>(.*?)</tr>#is', '', $html);

//menghapus semua tag <script property> dan isinya, dengan property/attribute apa saja
$html = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $html);

//menghapus semua tag <script property> dan isinya, dengan property/attribute apa saja
$html = preg_replace('/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/is', '', $html);

//menghapus semua tag <img property> dan isinya, dengan property/attribute apa saja
$html = preg_replace("/<img[^>]+\>/i", "", $html); 

Menghapus properti/atribut dari tag HTML

<?php
//menghapus property "type" dari tag <ul>, isinya tetap ada
$html = preg_replace('/<ul type="(.+?)">(.+?)<\/ul>/i', "<ul>$2</ul>", $html);

Menghapus isi dari property nya saja

//style akan dikosongkan/dihapus
preg_replace('/(<[^>]+) style=".*?"/i', '$1', $string);
//style akan dikosongkan/dihapus pada tag img
preg_replace('/(<img[^>]+) style=".*?"/i', '$1', $string);

Menghapus semua atribut di semua tag HTML

$teks = '<span class="abc" style="padding:10px;"><strong style="padding:10;margin:10;">ini teks tebal</strong></span>';
$teks = preg_replace("/<([a-z][a-z0-9]*)[^>]*?(\/?)>/si",'<$1$2>', $teks);
//hasilnya=> <span><strong>ini teks tebal</strong></span>

/*
penjelasan regex di atas
/              # Mulai Pattern
 <             # Cari '<' pada awalan setiap tag
 (             # Mulai group $1 nama tag
  [a-z]        # harus berisi 'a' sampai 'z'
  [a-z0-9]*    # harus berisi 'a' sampai 'z' atau angka '0' sampai '9'. 0 atau beberapa kali.
 )             # selesai Group tag
 [^>]*?        # temukan sesuatu selain tutup tag '>', 0 atau beberapa kali, apa saja
 (\/?)         # Mulai Group $2 - '/' jika ada
 >             # temukan tutup tag '>'
/is            # finish Pattern - Case Insensitive huruf besar dan kecil dan bisa Multi-line
*/

Membuat fungsi ago, konversi tanggal menjadi teks

function time_elapsed_string($datetime, $full = false) {
    $now = new DateTime;
    $ago = new DateTime($datetime);
    $diff = $now->diff($ago);

    $diff->w = floor($diff->d / 7);
    $diff->d -= $diff->w * 7;

    $string = array(
        'y' => 'year',
        'm' => 'month',
        'w' => 'week',
        'd' => 'day',
        'h' => 'hour',
        'i' => 'minute',
        's' => 'second',
    );
    foreach ($string as $k => &$v) {
        if ($diff->$k) {
            $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : '');
        } else {
            unset($string[$k]);
        }
    }

    if (!$full) $string = array_slice($string, 0, 1);
    return $string ? implode(', ', $string) . ' ago' : 'just now';
}

Ukuran file menjadi human readable

function human_filesize($bytes, $dec = 2) {
    $size   = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
    $factor = floor((strlen($bytes) - 1) / 3);

    return sprintf("%.{$dec}f", $bytes / pow(1024, $factor)) . @$size[$factor];
}

Cache file dengan waktu

$data_arr = array();
$file_cache = dirname(__FILE__).'/file_cache.json';
$getcache = false;

if (is_file($file_cache)) {

    $mod_time = filemtime($file_cache);
    $selisih_detik = time() - $mod_time;
    //$selisih_menit = floor(($selisih_detik%3600)/60);
    $selisih_menit = $selisih_detik/60);
    if ($selisih_menit < 60) {
        $getcache = true;
    }
    //dipanggil terus bisa jadi curl dibawah gagal
    $hasils = file_get_contents($file_cache);
    $data_arr = json_decode($hasils, true);
}

Cara scan folder dan file dengan PHP

//iterasi file
$myfiles = array_diff(scandir(dirname(__FILE__).'/namafolder'), array('.', '..')); 
foreach ($myfiles as $fname_prev) {
 if (strpos($fname_prev, '~')!==false) continue;//biasanya untuk skip temporary file
}

Demikian beberapa fungsi yang berguna yang biasa digunakan programmer PHP untuk keperluan ngoding.

Monggo jika ada yang ingin menambahkan fungsi berguna atau ingin membuat fungsi lainnya.

Semoga bermanfaat…

Bagikan
rasupe

Recent Posts

CPU usage tinggi pada server

Bismillaahirrohmaanirrohiim... Untuk mendeteksi cpu usage tinggi memang perkara rumit, adakalanya karena codingan bermasalah, akses ke…

2 weeks ago

Membersihkan log mongodb yang besar

Bismillaahirrohmaanirrohiim... Jika tidak dirawat dan dicek berkala, log mongodb akan semakin membesar. Bahkan sampai menghabiskan…

4 weeks ago

Cara mengakses gps di HP dengan javascript

Bismillaahirrohmaanirrohiim... Jika kita membuat website yang digunakan untuk memantau lokasi HP client, maka kita memerlukan…

4 months ago

Menghitung jarak dua titik koordinat dengan php dan javascript

Bismillaahirrohmaanirrohiim... Kali ini kita akan mencoba menerapkan rumus trigonometeri dari formula haversine, yang digunakan untuk…

4 months ago

Kemasan cleo botol kecil sering bikin tangan terluka

Bismillaahirrohmaanirrohiim... Disini saya akan berbagi pengalaman tentang susahnya membuka tutup botol cleo kecil ukuran 220ml.…

4 months ago

Solusi InsCek pada meteran PLN

Bismillaahirrohmaanirrohiim... Kali ini saya akan berbagi pengalaman tentang mati lampu yang disebabkan oleh permasalahan arus…

4 months ago