忍者ブログ

STEP UP BLOG

Home > ブログ > 記事一覧

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

既存PHPに後から拡張モジュールをインストールする

既にインストールされているPHPに後から拡張モジュールを追加しないといけない場合があると思います。
そのようなときの拡張モジュールのインストール手順です。
今回は例としてzipモジュールをインストールします。
PHPを新しくインストールするときならば--enable-zipをconfigureオプションとして指定すればいいのですが、この場合既にPHPはインストールされているのでそうもいきません。
尚、PHPをソースコードからコンパイル、インストールした場合で、HTTPサーバはApacheです。
$ cd /usr/local/src/php-5.x.xx/ext/zip

PHPソースコードのディレクトリにはextという拡張モジュールのソースコードが入っているディレクトリがあるので、extの中の該当するモジュールのディレクトリに移動します。
$ sudo /usr/local/bin/phpize
$ sudo ./configure --with-php-config=/usr/local/bin/php-config
$ sudo make
$ sudo make test
$ sudo make install
$ sudo vi /usr/local/lib/php.ini
+ extension=zip.so
$ sudo service httpd restart
$ php -i | grep zip
Registered PHP Streams => compress.zlib, php, file, glob, data, http, ftp, zip, phar  
gzip compression => enabled
bzip2 compression => disabled (install pecl/bz2)
zip
Libzip version => 0.10.1

以上となります。
configureでphp-configのエラーが出る場合は--with-php-configでphp-configのパスを指定してあげます。
簡単ですね。
という感じで気軽にモジュールは追加していったらいいと思います(外す場合はphp.iniのextension記述を削除すればいいので)。
PR

PsySHでPHPのREPL

RubyやPythonなどと同様にPHPにもREPLがあります。
それがPshSHです。
REPLとは"Read Eval Print Loop"の略で対話型の実行環境を指します。

http://psysh.org/

ありがたいことに最新のLaravel5.3では自動でインストールされます。
入ってなくてもcomposerを使えば簡単にインストールできます。
$ composer require psy/psysh:@stable

まずは起動してみます。
$ ./vendor/psy/psysh/bin/psysh 
Psy Shell v0.8.0 (PHP 7.1.0 — cli) by Justin Hileman
>>> help
  help       Show a list of commands. Type `help [foo]` for information about [foo].      Aliases: ?                     
  ls         List local, instance or class variables, methods and constants.              Aliases: list, dir             
  dump       Dump an object or primitive.                                                                                
  doc        Read the documentation for an object, class, constant, method or property.   Aliases: rtfm, man             
  show       Show the code for an object, class, constant, method or property.                                           
  wtf        Show the backtrace of the most recent exception.                             Aliases: last-exception, wtf?  
  whereami   Show where you are in the code.                                                                             
  throw-up   Throw an exception out of the Psy Shell.                                                                    
  trace      Show the current call stack.                                                                                
  buffer     Show (or clear) the contents of the code input buffer.                       Aliases: buf                   
  clear      Clear the Psy Shell screen.                                                                                 
  history    Show the Psy Shell history.                                                  Aliases: hist                  
  exit       End the current session and return to caller.                                Aliases: quit, q               
>>> 

>> $arr = [1,2,3];
=> [
     1,
     2,
     3,
   ]
>>> 1 + 2;
=> 3
>>> function square($x) {
... return $x*$x*$x;
... }
=> null
>>> square(4);
=> 64

というようにインタラクティブにPHPを実行できます。
試してみてはいかがでしょうか。
それではよいお年を。

privateの罠

最近ハマった挙動について書きます。
コードを見たほうが早いので以下にコード。
<?php

class ClassA
{
    private $member_variable = 'A';

    public function getMemberVariable()
    {
        return $this->member_variable;
    }
}

class ClassB extends ClassA
{
    private $member_variable = 'B';

    public function getMemberVariable()
    {
        return $this->member_variable;
    }
}

class ClassC extends ClassA
{
    private $member_variable = 'C';
}

$a = new ClassA();
$b = new ClassB();
$c = new ClassC();

echo $a->getMemberVariable()."\n";
echo $b->getMemberVariable()."\n";
echo $c->getMemberVariable()."\n";

$ php test.php 
A
B
A

$c->getMemberVariable()で"C"が返ってくると思ったら"A"でした。。
"C"を返すには以下のようにprivateをprotectedに変えるとできます。
<?php

class ClassA
{
    protected $member_variable = 'A';

    public function getMemberVariable()
    {
        return $this->member_variable;
    }
}

class ClassB extends ClassA
{
    protected $member_variable = 'B';

    public function getMemberVariable()
    {
        return $this->member_variable;
    }
}

class ClassC extends ClassA
{
    protected $member_variable = 'C';
}

$a = new ClassA();
$b = new ClassB();
$c = new ClassC();

echo $a->getMemberVariable()."\n";
echo $b->getMemberVariable()."\n";
echo $c->getMemberVariable()."\n";

$ php test.php 
A
B
C

子クラスから親クラスのメソッドを呼んで、そのメソッド内でprivate変数を呼ぶと親のprivate変数になるんですね。
理屈がわかればなるほどなんですが、どこがおかしいのか見つけるのが意外と難しかったです。。

rsyncのスラッシュありなしの注意点

rsyncでたまに大きいディレクトリを同期し終わってから失敗したとならないための注意。
同期元にスラッシュをつけるかつけないかの話です。
以下、例です。
$ ls
.  ..  dst  src
$ ls src
.  ..  a.txt  b.txt  c.txt
$ ls dst
.  ..

スラッシュあり
$ rsync -avh src/ dst
sending incremental file list
./
a.txt
b.txt
c.txt

sent 226 bytes  received 72 bytes  596.00 bytes/sec
total size is 6  speedup is 0.02
$ ls dst
.  ..  a.txt  b.txt  c.txt

スラッシュなし
$ rsync -avh src dst
sending incremental file list
src/
src/a.txt
src/b.txt
src/c.txt

sent 240 bytes  received 73 bytes  626.00 bytes/sec
total size is 6  speedup is 0.02
$ ls dst
.  ..  src
$ ls dst/src/
.  ..  a.txt  b.txt  c.txt

スラッシュがあると中のファイルだけを同期させますが、スラッシュがないとディレクトリごと同期させるようになります。
目的によりますが、気をつけないと想定していないディレクトリ構成となって同期してしまうので注意しましょう。

html5のdownload属性

Webサイトから何かファイルをダウンロードさせたいとき、例えば、
ダウンロードサンプル

のようにリンクを貼った場合、ファイルの種類によってはダウンロードではなくブラウザで表示するかたちになります(PDFなど)。
気を利かせて開いてくれたのはうれしいけれど、今見たいわけじゃないんだブラウザ君。
というわけでそんなときに便利なのがhtml5で仕様が作られたdownload属性です。

https://developer.mozilla.org/ja/docs/Web/HTML/Element/a

ダウンロードサンプル

のように書くと、リンク先が明示的にダウンロードされるようになります。しかも
ダウンロードサンプル

のように書くと、ダウンロードするときのファイル名までも指定できます。
便利!!
しかも!!
一部のブラウザまたの名をSafariやIEではこの属性は使えません!!
早く対応してください><

PAGE TOP