[メモ]libxl:PHP7でExcelを扱うphp_excelのインストール[libxlは有料]

LibXL

今回は有料のlibxlをPHP7で使うためにしたことのメモです。
※PHPExcelより全然メモリ喰わないし、グラフとかのオブジェクトもそのまま行けるのでちょーいいです。

ダウンロードページ
購入ページ(※1ライセンス$199)

今回ダウンロードしたのは現時点で最新のLinux版3.8.0です。

セットアップページのPHP extension (3rd-party, open-source)からPHPへのセットアップ方法のページへとび、そちらのページの「extension for PHP」のリンクからPHPのエクテンションのサイトへ行けます。
PHP extension (3rd-party, open-source)のページではPHP5でのセットアップ方法が書かれています。
最初この方法でexcel.soを作ってみましたがPHP7では上手く動きませんでした。

最終的に以下の様にしました。(すべてrootで実行しています)
まず、最新のPHP7を使用するためにダウンロードし展開

cd /usr/local/src/
wget http://jp2.php.net/get/php-7.1.5.tar.bz2/from/this/mirror -O php-7.1.5.tar.bz2
tar jxvf php-7.1.5.tar.bz2
cd php-7.1.5

php_excelをクローンしPHP7をchekoutし、buildconf –force実行

git clone https://github.com/iliaal/php_excel.git ext/excel
cd ext/excel && git checkout php7 && cd ../..
./buildconf --force

PHP7をconfigureしmake、make install
configureは、それぞれの環境に合わせてください。今回は端折っています。

./configure \
--with-excel \
--with-libxl-incdir=/usr/local/src/libxl-3.8.0.0/include_c \
--with-libxl-libdir=/usr/local/src/libxl-3.8.0.0/lib64
make
make install

後は、webサーバーの再起動をすると使えるようになっているはずです。
確認は、phpinfoなり、コンソールでphp -i|grep excelでどうぞ。

スポンサーリンク

[メモ]アニメーションgifのチェック[php]

おひさしぶりです。

タイトルの通り、チェック対象のファイルがアニメーションgifかそうじゃないかのチェックプログラムを・・・

で、とほほさんのGIFフォーマットの詳細を参考にしてみました。

/**
 * アニメーションGIFかチェック
 *
 * @params string $img_file   画像ファイル(画像ファイルまでのPATH付き)
 * @return bool               true:アニメーションGIF false:それ以外
 */
function checkAnimationGif($img_file) {
    if (!file_exists($img_file)) {
        // ファイルが無い
        return false;
    }
    if (!($fp = fopen($img_file, "rb"))) return false;
    $head = fread($fp, 6);
    if (!preg_match("/^GIF89a/", $head)) {
        // GIF89a 以外
        return false;
    }
    // カウント初期化
    $gce_cnt = 0;
    while (!feof($fp)) {
        if (bin2hex(fread($fp, 1)) != "21") continue;
        switch (bin2hex(fread($fp, 2))) {
            /*
            // 2014-11-06 削除
            case "ff0b": // Application Extension
                fclose($fp);
                return true;
                break;
            */
            case "f904": // Graphic Control Extension
                $gce_cnt++;
                if ($gce_cnt > 1) {
                    fclose($fp);
                    unset($gce_cnt);
                    return true;
                }
                break;
        }
    }
    fclose($fp);
    unset($gce_cnt);
    return false;
}

多分これで、チェックできるはず・・・

追記:2014-11-06
adobeのフォトショップで作成されたgifでApplication Extensionが含まれる通常のgifが作成されていることがわかりましたので
上記のソースを修正しました。

スポンサーリンク

[愚痴]twitter REST API[orz]

ご無沙汰しております。

表題の件について、ひとつ愚痴を・・・

自分自身のtwitterアカウントのusertimlineを、「REST API」を使用しcronで定期的に取得していたところ・・・

取得が終わらず取得プログラムのプロセスが、ずっと残っているではありませんかorz

この原因を色々調べてみたけど良く分からないo…rz

プログラムにどこまで実行できたのかをlogに出力したところ、「REST API」にリクエストを投げ(file_get_contentsを使用)て返ってこないことがわかりました。

本当に返ってきていないか調べるためにfile_get_contentsではなく、fopenで接続をしてからfreadで1バイトずつ、ファイルに出力したところ・・・jsonデータがファイルに出力されていました。

と言うことは?どういうこと??

feof関数のマニュアル以下抜粋

返り値
ファイルポインタが EOF に達しているかまたはエラー (ソケットタイムアウトを含みます) の場合に TRUE 、 その他の場合に FALSE を返します。

注意
警告
fsockopen() でオープンした接続がサーバーによって閉じられていない場合、feof() はハングします。回避策は以下の例を参照ください。

“オープンした接続がサーバーによって閉じられていない場合、feof() はハングします。”

プロセスが終わらず残っていたのは、ハングしてたからか?というメボシをつけてみた・・・

で、twitterなので、freadで固定バイト数ずつ読み込んで結合し、その文字列がjson_decodeでfalseを返さない場合、while文を抜けるようにしてみたところ上手くこの処理で抜ける場合の「REST API」のリクエストがあった、これで十中八九『EOF』がtwitterのサーバーから送られていないと思われ・・
※上記のwhile文を抜けるもう少し詳しい条件としは、!feof($fp)の場合で、json_decode($str)がfalseではない場合にbreakです。

結局、REST APIのリクエストが届くサーバーが、EOFを返すサーバーと返さないサーバーがあるということで、どうもこの返さないサーバーにあたることが多いのが問題・・・
ていうか、twitterさんeof返しておくれ・・・

スポンサーリンク

[忘れっぽい]phpのmongoドライバーのインストール[メモ]

何気に、phpのバージョンを上げて、mongoドライバが認識されないのを2時間くらい悩んだので、メモメモ・・・

↓インストール手順
http://www.php.net/manual/ja/mongo.installation.php#mongo.installation.manual
取りあえず、前回の使ったドライバのディレクトリで手順をやっていたのでちゃんとmakeされていなかったorz

まぁ、やる前に「make clean」しろと自分に言い聞かせる・・・

あぁ無駄な時間だった・・・

スポンサーリンク

[メモ]プログラムによるpdf出力[memo]

久しぶりに・・・
書く時はいつも久しぶり・・・

IEでSSL環境下の場合にPDFファイルをプログラムで出力すると、セキュリティがうんたらかんたらと言われるというのがある。

IE意外だと以下のように書くと普通に出力(表示)される。

header('Content-type: application/pdf');
readfile('original.pdf');

IEだと以下のヘッダーがないと上手くいかない

header("Pragma: public"); //<----- これ
header("Cache-Control: public, must-revalidate"); //<----- これ
header('Content-type: application/pdf');
readfile('original.pdf');

※たぶん古いIEで出る現象だったきがする・・・

スポンサーリンク