Skip navigation

Tag Archives: php


Just share a bit. When we want to commit source code, it’s better to check locally before pushing the source code to repository which then check them at the build server.

Here’s a source code for the wrapper script. The needed binaries are PHPCS, ESLint, and Stylelint.

To execute in the pre-commit, you can just use this.

SOURCE_FILES=${SOURCE_FILES:-`git diff-index --name-only --diff-filter=ACMR HEAD`}
export SOURCE_FILES
./checkstyle.sh

exit $?
Iklan

Just met a problem when I tried to serialize a PHP DateInterval object in HHVM (at least for 3.9.1). Turns out the DateInterval is unserializable. Create a bit workaround for this.

<?php

$dateinterval1 = new DateInterval('PT1H');
$baseDate = new DateTimeImmutable();
$date1 = $baseDate->add($dateinterval1);
$string1 = $dateinterval1->format('%y years %m months %d days %h hours %i minutes %s seconds');

$dateinterval2 = DateInterval::createFromDateString($string1);
$date2 = $baseDate->add($dateinterval2);

$string2 = $dateinterval2->format('%y years %m months %d days %h hours %i minutes %s seconds');
if ($string1 == $string2) {
    print "Formats are equal\n";
}
if ($date1 == $date2) {
    print "Objects are equal\n";
}
if ($date1->getTimestamp() == $date2->getTimestamp()) {
    print "Timestamp are equal\n";
}

The test can be seen here: https://3v4l.org/HvLFP


Usually before committing a file we need to check modified files against the code convention before committing to the code repository.

Here’s a single line to run modified files in Git against PHPCS.

git ls-files -m | grep '\.php$' | xargs ./vendor/bin/phpcs -s --standard=etc/phpcs/ruleset.xml

Code above assumes you install PHPCS using composer and have your own standard located in the etc/phpcs/ruleset.xml.

UPDATE

To check all uncommited files, run this

git ls-files --others --exclude-standard | grep '\.php$' | xargs ./vendor/bin/phpcs -s --standard=etc/phpcs/ruleset.xml

Just another snippet. By using Chef’s PHP cookbook, we can easily install Zend Opcache. That if we still use PHP 5.4 since 5.5. have the opcache in the default distribution.

Put this in the recipe

php_pear "opcache" do
  package_name "ZendOpcache"
  action :install
  preferred_state "beta"
  zend_extensions ["opcache.so"]
  directives node['php']['opcache']['directives']
end

and this in the attributes

default['php']['opcache']['directives'] = {
    'memory_consumption' => 128,
    'interned_strings_buffer' => 8,
    'max_accelerated_files' => 4000,
    'revalidate_freq' => 60,
    'fast_shutdown' => 1,
    'enable_cli' => 1,
    'save_comments' => 0,   
}

Kemarin saya sedang iseng membuka-buka StackOverflow dan menemukan pertanyaan ini Displaying CSV file content in Yii Framework’s CGridView.

Inti pertanyaannya adalah bagaimana menampilkan isi file CSV menggunakan GridView.

Cara mudahnya adalah dengan menggunakan CArrayDataProvider.

$file = fopen('test.csv', 'r');
$data = array();
while (($line = fgetcsv($file)) !== FALSE) {
    //$line is an array of the csv elements
    $data[] = $line;
}
fclose($file);
$columns = array();
foreach ($data[0] as $key => $value) {
    $columns[] = array(
        'name' => $key,
        'header' => $value,
    );
}
$data = array_slice($data, 1);
$dataProvider = new CArrayDataProvider($data, array(
    'keyField' => 0,
));
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider' => $dataProvider,
    'columns' => $columns
));

Jika ingin menggunakan secara generik, kita bisa membuat kelas baru bernama CsvDataProvider.

class CsvDataProvider extends CArrayDataProvider {

    private $_columns = array();

    public function __construct($file, $config = array()) {
        $handler = fopen($file, 'r');
        $data = array();
        while (($line = fgetcsv($handler)) !== FALSE) {
            $data[] = $line;
        }
        fclose($handler);
        $this->_columns = array();
        foreach ($data[0] as $key => $value) {
            $this->_columns[] = array(
                'name' => $key,
                'header' => $value,
            );
        }
        $data = array_slice($data, 1);
        parent::__construct($data, array_merge($config, array(
            'keyField' => 0,
        )));
    }

    public function getColumns() {
        return $this->_columns;
    }
}

cara menggunakannya mudah

$dataProvider = new CsvDataProvider('file.csv');
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider' => $dataProvider,
    'columns' => $dataProvider->getColumns(),
));

Tapi kode di atas belum bisa memfasilitasi sorting dan pagination. Kerugiannya juga adalah kinerja yang buruk jika digunakan pada berkas CSV berukuran sangat besar. Dan ada ide menarik untuk menggunakan library pemrosesan CSV yang hemat memori dan dengan fungsi lengkap. Nanti mungkin kalau sempat saya tuliskan penuhnya.


Bulan lalu saya diminta untuk mengisi acara Iftar untuk komunitas PHP Indonesia. Saya membawakan materi tentang “What’s New In Yii2” dan juga materi tambahan “What’s New In PHP 5.5”. Selain saya, ada juga pengisi lain yakni mas Iskandar Soesman dari Detik.com yang berbagi tentang “Optimize PHP Application in High Traffic Environment”.

PHP Meetup Indonesia

Berikut adalah slide dan videonya. Enjoy! Video-video dari acara PHP Indonesia lainnya dapat dilihat di link ini.


Setelah sekian lama terbengkalai, akhirnya saya melanjutkan postingan ini. Di postingan tersebut (dan postingan-postingan sebelumnya), saya menulis tentang bagaimana mengkustomisasi CJuiAutoComplete sesuai dengan kebutuhan. Tapi kelemahan dari implementasi sebelum-sebelumnya adalahautocompletetersebut terikat pada satucontroller dan agak repot untuk dipakai diview yang lain.

Agar dapat dengan mudah digunakan di view yang lain solusinya adalah dengan membungkus autocomplete tersebut menjadi sebuah Widget. Dengan demikian, untuk menggunakan autocomplete, kita cukup meletakkan kode widgetnya saja. Permasalahan dengan Widget ini adalah bagaimana cara mendapatkan data untuk autocomplete tersebut? Caranya mudah, yakni dengan menggunakan fitur ActionProvider pada Widget.

Read More »


Saya sangat senang menggunakan XAMPP baik itu di Windows maupun Linux karena instalasi yang sangat simpel. Apalagi jika digunakan di Linux, kita tidak perlu pusing-pusing menjalankan perintah-perintah instalasi (apalagi juga mengcompile source code). Cukup download paket programnya, kemudian extract di direktori yang diinginkan.

Hanya saja belakangan saya membutuhkan memcached untuk instalasi XAMPP di komputer saya untuk mengetes aplikasi web saya yang menggunakan memcached. Sebenarnya bisa tinggal instalasi php extension untuk memcached dari PECL.

$/opt/lampp/bin/pecl install memcache

Masalahnya ini tidak bisa langsung dilakukan karena ada perbedaan arsitektur antara XAMPP dengan komputer saya. XAMPP for Linux (atau sering disebut LAMPP) yang saya instal menggunakan arsitektur 32 bit (sepertinya memang hanya disediakan yang 32 bit) sementara komputer saya menggunakan Ubuntu 64bit. Meskipun berhasil diinstal tetapi nanti tidak bisa dijalankan.

Read More »


Kemarin sore saya ingin membuat bot twitter yang bisa mengupdate status twitter setiap jam. Dan caranya ternyata sangat mudah. Cukup unduh library Twitter OAuth di sini kemudian extract di “/protected/vendors/twitteroauth”.

jadinya seperti ini

$ls protected/vendors/twitteroauth
-rw-rw-r-- 1 petra petra 26482 May  4 10:12 OAuth.php
-rw-rw-r-- 1 petra petra  7755 May  4 10:12 TwitterOAuth.php

bagi yang menggunakan server berbasis *NIX (yang case sensitive) ubah nama file twitteroauth.php menjadi TwitterOAuth.php

Sekarang tinggal membuatconsole commanddi “protected/commands”

<?php
class TweetbotCommand extends CConsoleCommand {

        const CONSUMER_KEY = 'xxxxxxxxxxxxxxxxx';
        const CONSUMER_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
        const OAUTH_TOKEN = 'xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
        const OAUTH_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

        public function actionTweet() {
                $message = "Hello World!";

                Yii::import('application.vendors.twitteroauth.*');
                $connection = new TwitterOAuth(self::CONSUMER_KEY, self::CONSUMER_SECRET, self::OAUTH_TOKEN, self::OAUTH_SECRET);
                $connection->get('account/verify_credentials');
                $connection->post('statuses/update', array('status' => $message));
        }

}

Untuk isi dari variabel CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, dan OAUTH_SECRET bisa dilihat di panduan ini.

Sekarang untuk menjalankannya tinggal eksekusi YIIC saja.

$/usr/bin/php protected/yiic tweetbot tweet
$#atau bisa cara di bawah
$php protected/yiic tweetbot tweet
$#atau juga bisa cara di bawah
$protected/yiic tweetbot tweet

Dan dengan mudahnya agar tweetnya bisa diupdate setiap jam adalah dengan menambahkan entri di crontab

0 * * * * * /usr/bin/php protected/yiic tweetbot tweet

(Karena terlalu simpel, kodenya tidak saya masukkan di github)


Salah satu trik penggunaan method scopes di CActiveRecord yang saya suka adalah untuk membatasi SELECT pada SQL Query. Di dalam dokumentasinya sendiri, Yii memberikan contoh penggunaan scopes untuk membatasi kondisi serta urutan dari serangkaian model, tapi ada beberapa trik yang sering saya gunakan pada scopes ini. Seperti yang kita ketahui, salah satu rule of thumbs penggunaan SQL adalah “Only Select What You Need”.
Read More »

%d blogger menyukai ini: