PHP

【CentOS/PHP】phpenvを道入して複数バージョンのPHPを管理する。

phpenv

複数バージョンのPHPを管理するツール。PHPのバージョンをフォルダごとに分けたりとかが出来る。

インストール

下記コマンドを順番に実行。

ここまできたらphpenvコマンドが有効になる。

PHPをインストール

下記コマンドでインストール可能なPHPのバージョンを確認。

こんな感じでリスト表示されるので、この中から使いたいバージョンを決める。
んで例えば5.3.29をインストールしたい場合は下記の通り。

PHPインストール(コンパイル)時のオプションは下記ファイルに記載されているので確認すること。

インストール時のオプションを書き換えたい場合はこれらのファイルを編集すればよい。

オプションを足したい場合は

オプションを削除したい場合は

という記述を各バージョンごとのファイルに追記してやる。
※ここでの注意点として、configure_optionを最終行に追記すると反応しない場合があるらしいので先頭行に追記するのがベター。

たとえばPHP5.3.29をインストールする際に--enable-fpmを追加したければ、 ~/.phpenv/plugins/php-build/share/php-build/definitions/5.3.29configure_option "--enable-fpm"を追記して保存する。

PHPのバージョンを切り替える

まずは下記コマンドでインストール済のPHPバージョンを確認する。

このようにリスト表示される。

そしたら状況に応じて下記コマンドのいずれかを実行。

例えばバージョン5.4.35を現在のディレクトリ以下のみで有効にしたい場合はこんな感じ。

上記を実行すると、そのディレクトリに.php-versionが生成され、その後指定したバージョンが有効になる。

試しにそのフォルダ内でphp -vを実行してやると、ちゃんとバージョンが適用されていることが分かる。

Apacheから特定のPHPバージョンを有効化する

  • まずはhttpd-develパッケージに付属しているapxsの場所を特定する。
    ※下記コマンドを実行すればOK。

  • 次にインストールしたいPHPのバージョンを決め、そのPHPバージョンのコンパイルオプション定義ファイルに次の行を追記する。

5.4.35の場合は~/.phpenv/plugins/php-build/share/php-build/definitions/5.4.35に下記を追記。

apxsへのパスは先ほどwhichコマンドで調べた際のものを指定。

  • 次にPHPのMakefileが出力するlibphp5.soの出力先パスを変更するためにパッチを当てる。

  • 次の内容を記載したファイルをphp-build.patchとして保存。

  • 下記コマンドを実行してパッチを当てる。
  • ビルドが完了すると、下記ディレクトリにlibphp5.soが出力される。
  • 最後にこのlibphp5.sohttpd.confでロードし、サーバーを再起動すれば完了。

※自分の場合はPHPのビルド完了と共に、httpd.conf内に自動で下記が追記されていたが、もし追記されていなければ追記して保存しれやればよい。

違うバージョンを試したい場合も同様にこの手順を繰り返してやればOK。 もしサーバーにもともとインストールしてあるPHPに戻したい場合はLoadModuleの行を消すなりコメントアウトするなりして、サーバーを再起動すればOK。

【PHP5.6】intlが有効にならない問題。

CentOS7にphp56-intlをインストールした際に有効にならない問題でハマった。

intl自体はremiからインストールしたもののサーバーを再起動しても読み込まれなかったので下記のようにして対応。

  1. phpinfo()で現在のextension_dirを調べる。
  2. 設定されているフォルダに移動。
    ※自分の場合/usr/lib64/php/modulesだった。
  3. remiのモジュールインストール先を調べる。 ※調べたら/opt/remi/php56/root/usr/lib64/php/modules/だった。
  4. 現在のextension_dirからremiのモジュールインストール先フォルダに対してシンボリックリンクを貼る。
  1. 最後にphp.iniに下記を追記

んで最後にhttpdをリスタートしたら読み込んでくれた。

ん?、yumでいれてもこの作業必要なのか、、、?

【PHP】超巨大な数値の足し算引き算を行う方法。

PHPで巨大過ぎる数をintのまま扱おうとするとPHP_INT_MAXで定められた値に丸め込まれてしまい正しい計算が行えないため、どうしても演算を行いたい場合は文字列として操作する必要がある。

ちなみにPHPでの最大整数は32bit環境では-2^31から2^31-1。64bit環境では-2^63から2^63-1となる。

そんな大きい数字扱う機会ねーよ!

と思っていた時代が僕にもありました。

というのもTwitterに関連するサービスを作っていた際、APIから帰ってくるツイートIDが18桁とかなんですよ。ええ。
皆さんご存知の通りPHP32bitだと扱える整数は10桁、64bitならまぁ19桁まで扱えるんですけれど自分の環境だと入ってない。

ちなみに自分の環境がPHP32bitかPHP64bitかを確認するには、下記コマンドをCLIから実行してみればわかる。

4と表示されれば32bit
8と表示されれば64bit

である。

で、手っ取り早く文字列のまま足し算、引き算が出来ないものかと調べていたら、下記ブログを発見。

http://ambiesoft.fam.cx/blog/archives/1822

これはマジで便利。

PearのMath_BigIntegerを用いても可能とのこと。

http://pear.php.net/package/Math_BigInteger

試しに中身を見てみたら恐ろしくゴツイライブラリだった件。

【Twitter】StreamingAPIを使ってみる。

TwitterのStreamingAPIはRestApiと違い実行回数の制限が無いため、(同時コネクション数の制限はある。)リアルタイムで無限にツイートを取得し放題なのである。

Phirehoseを用いてStreamingAPIを利用する

ゼロからやろうとすると大変なので偉大なるライブラリ様を使わせていただくことにする。

  • まずは下記URLからライブラリ本体をダウンロード。

https://github.com/fennb/phirehose

ダウンロードできたらzipを解凍。exampleフォルダの中に、filter-oauth.phpがあるのでこいつをカスタマイズする。
※バックアップのためにコピーを保存しとこう。

開くと下記のようになっているのでdefineで定義されている4つの定数を自分のものに設定する。

んであとはこのファイルにHTTPサーバーを経由してアクセスするとツイーが永遠と流れてくる。

とても簡単にStreamingAPIが利用できるようになるのでめちゃくちゃオススメ。

下記サイトを参考にさせていただきました。

http://www.kyoto-life.com/blog/814

【twitteroauth】PHPのTwitterOauth用ライブラリをnamespaceを用いたFW内で利用可能にする。

CakePHP3にぶち込んだ時の話。

https://github.com/abraham/twitteroauth/

上記URLのライブラリはPHPerには有名だけれどもnamespaceが記述されていないので、Symfony2を始めとするモダンなフレームワークにぶちこもうとするとなかなかに使い辛い。

ということでファイル内容を若干カスタマイズする。

まずはgithubよりzipをダウンロード。
利用するのはtwitteroauthフォルダ以下のファイルたち。

twitteroauth.phpをいじりましょう。

require_onceを消す

  • 10行目の下記記述を葬り去る。

名前空間を授けてやる

ファイル先頭に下記を追記。
※namespaceの部分はプロジェクトによって適切に設定されたし。今回はCakePHP3のsrc/Lib/twitteroauth以下にライブラリを配置したので下記のように記述。

composer.jsonのautoload設定に追加する

twitteroauth.phpはともかくOAuth.phpはpsrに準拠してないといったレベルを超越しているライブラリなので下記の通りfilesに直接パスを指定してやる。

最後にphp composer.phar updateをしてやればOK。php composer.phar dumpautoloadでもOK。てか後者のほうが速い。

【Twitter, PHP】Twitterログイン機能をPHPで実装する。

際の分かり易いコードサンプルをみつけたのでペタリ。

http://temog.info/archives/programming/twitter-oauth-php-login.html

すごくわかりやすかったです。ありがとうございます。

【PHP】PC、スマホ(Android、iPhone)のUAを簡単に切り替えてWebページにアクセス出来るSocketクラスを作った。

超絶自分用。

<?php

class Socket {
    
    private $connect;
    
    private $ua;
    
    private $url;
    
    private $redirectCount;
    
    public function __construct()
    {
        $this->connect = curl_init();
    }
    
    public function get($autoReboot = true)
    {
        $this->setOptions();
        
        $contents = curl_exec($this->connect);
        
        $this->redirectCount = curl_getinfo($this->connect, CURLINFO_REDIRECT_COUNT);
        
        curl_close($this->connect);
        
        if ($autoReboot) {
            $this->reboot();
        }
        
        return $contents;
    }
    
    public function setUrl($url)
    {
        $this->url = $url;
        
        return $this;
    }
    
    /**
     * default user agent
     * @return Socket
     */
    public function setPcUa()
    {
        $this->ua = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36';
        
        return $this;
    }
    
    /**
     * custom user agent
     * @param string $isAndroid
     * @return Socket
     */
    public function setSpUa($isAndroid = false)
    {
        if ($isAndroid) {
            $this->ua = 'Mozilla/5.0 (Linux; U; Android 4.1.1; ja-jp; Galaxy Nexus Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30';
        } else {
            $this->ua = 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A405 Safari/600.1.4';
        }
        
        return $this;
    }
    
    public function reboot()
    {
        $this->connect = curl_init();
        $this->setPcUa();
        $this->resetUrl();

        return $this;
    }
    
    public function getLastRedirectCount()
    {
        return $this->redirectCount;
    }
    
    private function resetUrl()
    {
        $this->url = null;
    }
    
    private function setOptions()
    {
        $this->validation();
        
        curl_setopt($this->connect, CURLOPT_URL, $this->url);
        curl_setopt($this->connect, CURLOPT_USERAGENT, $this->ua);
        curl_setopt($this->connect, CURLOPT_CONNECTTIMEOUT, 5);
        curl_setopt($this->connect, CURLOPT_TIMEOUT, 10);
        curl_setopt($this->connect, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($this->connect, CURLOPT_FAILONERROR, true);
        curl_setopt($this->connect, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($this->connect, CURLOPT_AUTOREFERER, true);
    }
    
    private function validation()
    {
        try {
            if (empty($this->url)) {
                throw new RuntimeException();
            }
        } catch (Exception $e) {
            die('Please set the url.');
        }
    }
    
}

使い方は下記の通り。

$socket = new Socket();

$url = 'http://www.yahoo.co.jp';

$result = $socket->setUrl($url)->get();

// リダイレクトカウントも取れるよ
$socket->getLastRedirectCount()

まぁメリットはcurlを使っているのでfile_get_contents()よりも速いよってくらいかな。

 

【PHP】Curlでページを取得した際のリダイレクト回数を取得する。

curl_getinfo()を用いる。

// 通信の際、CURLOPT_FOLLOWLOCATIONを有効にしてなければならない点に注意
$redirectCount = curl_getinfo($ch, CURLINFO_REDIRECT_COUNT);

ほかにも色々と取得出来るので詳しくは公式を参照されたし。

http://php.net/manual/ja/function.curl-getinfo.php