ラベル php の投稿を表示しています。 すべての投稿を表示
ラベル php の投稿を表示しています。 すべての投稿を表示

2012年4月6日金曜日

apache2からのphpが実行できなかった時のメモ

php5.4をソースからビルドした際に何かやってしまったのか、ブラウザからphpの実行がされなくなりました。
phpファイルがダウンロードされる状態になったので、その時の対応メモ

まず、こちらのページを参考にしました。

以下のファイルが見つかりませんでした。
/etc/apache2/mods-available/php5.conf
php関連のは以下のファイルがありました。
/etc/apache2/mods-available/php5filter.conf
/etc/apache2/mods-available/php5filter.load
次に、一番最初にphpとapacheをインストールした時に参考にしたページの通りに、設定したのですがダメでした。

グーグル先生で色々調べてたら、非常に参考になるページが見つかりました。
参考ページの通りに有効なモジュール一覧に、php関連のモジュールがありませんでした。
インストールされていた、php関連のモジュールを有効にしてみました。

sudo a2enmod php5filter
apacheを再起動し、ブラウザから確認。

php5.4じゃない、、、
php5.4をインストールした時は、apacheに関係するconfigureオプションつけていなかったので、ビルドし直してインストールする。

./configure --enable-mbstring \
--prefix=/usr/local/php \
--enable-mbregex \
--with-zlib=/usr/local/zlib \
--with-zlib \
--enable-zip \
--enable-ftp \
--enable-pcntl \
--enable-soap \
--with-mcrypt \
--with-gd \
--enable-pdo \
--with-pear \
--with-readline \
--with-apxs2=/usr/bin/apxs2 \
--with-mysql=/usr/local/mysql
mysqlも利用できるようにする。
mysql5.6のインストール時に知った、pacoを使って管理できるようにする。
make
sudo paco -D make install
先程有効にしたモジュールを無効にする。
sudo a2dismod php5filter
apacheリスタート後、再度ブラウザから確認

php5.4にかわったことを確認できました。
apt-getでインストールしたパッケージとかと混ざって変なことになってそうなので、そのうち整理しようかなと思います。

2012年3月25日日曜日

PHPでscanf

PHP extension の勉強をしていて、C言語を久々に触っていた時に、PHP で scanf みたいなのって書いたことないなと思ったので、調べて書いてみました。

こちらのエントリに書いてあったことをそのまま試してみました。

・scanf のサンプル
<?php
echo '文字列を入力してください。' ."\n";
fscanf(STDIN, '%s', $str);
var_dump($str);

echo '文字列を入力してください。' ."\n";
$stdin = fopen('php://stdin', 'r');
$str = trim(fgets($stdin));
fclose($stdin);
var_dump($str);


・実行結果


どちらも求める結果になりました。
違いに関しては、僕が参考にしたエントリを見ていただければと思います。

2012年3月19日月曜日

PHP5.4インストール、Traitsの利用

PHP5.4が安定版としてリリースされたので、インストールしてみました。
インストール手順はこちらの記事を参考にしました。

・ソース取得
wget http://www.php.net/get/php-5.4.0.tar.gz/from/jp.php.net/mirror -O php-5.4.0.tar.gz

・tarファイル展開
tar xvf php-5.4.0.tar

・コンパイルオプション設定
cd php-5.4.0
./configure --enable-mbstring \
--prefix=/usr/local/php \
--enable-mbregex \
--with-zlib=/usr/local/zlib \
--with-zlib \
--enable-zip \
--enable-ftp \
--enable-pcntl \
--enable-soap \
--with-mcrypt \
--with-gd \
--enable-pdo \
--with-pear \
--with-readline \

・make、インストール
make
sudo make install

・確認


これでPHP5.4のインストールが完了しました。


新機能の Traits を試してみました。
Traits はソースの再利用に有効になるかもしれません。詳しくはマニュアル に書いています。

Traits を利用したシングルトン
<?php
trait TraitSingleton {
private static $_instance;

private function __construct() {
}

public static function getInstance() {
if (isset(self::$_instance) === false) {
self::$_instance = new static;
}

return self::$_instance;
}
}


シングルトン Traits 利用
<?php
require_once('/home/isuzuki/dev/php/php5.4/TraitSingleton.php');

abstract class Base {
}

class TraitSample1 extends Base {
use TraitSingleton;

private function __construct() {
}

public function echoClass() {
echo __CLASS__ ."\n";
return true;
}
}

class TraitSample2 extends Base {
use TraitSingleton;

private function __construct() {
}

public function echoClass() {
echo __CLASS__ ."\n";
return true;
}
}

$obj1 = TraitSample1::getInstance();
$obj1->echoClass();
$obj2 = TraitSample2::getInstance();
$obj2->echoClass();


実行結果


これで、Traitsが無事利用できていることがわかりました。

2012年3月12日月曜日

HipHop for PHP インストール

FacebookのHipHop for PHPをUbuntu 11.10にインストールしてみました。
手順は、Facebookが公開している手順(Building and Installing on Ubuntu 11.10)どおりに行えば問題ないです。

何点かインストール中に躓いたところで、OSを32bitにしていたので、cmakeの時点でwarningが出ました。
32bitでのcmake結果です。


32bitでも動かせるようですが、OSを64bitにして再トライしました。

同様の手順で、cmakeしたところ、特に何もメッセージも出ないので、続けてmakeし、実行しました。
ソースの修正を見逃していて、segmentation faultで落ちました。

こちらも、手順に書いてあるように、
lib/ssluse.c をgit hubのとおりに修正、
src/runtime/ext/extension.cpp も同様にgit hubのとおりに修正。

make後、無事実行できることを確認しました。

サンプルプログラムを、HipHopで実行してみました。
・PHPソース
<?php
echo 'HipHop for PHP' ."\n";
echo 'Hello World' . "\n";


実行結果


実行後、指定したディレクトリ以下には実行ファイルや、C++に変換されたソースなどがありました。
実行ファイルの結果


・C++ソース
/tmp/hphp/php/home/isuzuki/dev/php/hello.cpp

#include <runtime/base/hphp.h>
#include <sys/literal_strings_remap.h>
#include <sys/scalar_arrays_remap.h>
#include <sys/scalar_integers_remap.h>
#include <sys/global_variables.h>
#include <sys/cpputil.h>
#include <php//home/isuzuki/dev/php/hello.fws.h>
#include <php//home/isuzuki/dev/php/hello.h>

// Dependencies
#include <runtime/ext/ext.h>
namespace hphp_impl_starter {}

namespace HPHP {
////////////////////////////////////////////////////////////////////////////
///

/* preface starts */
extern CallInfo ci_;
/* preface finishes */
Variant pm_php$$home$isuzuki$dev$php$hello_php(bool incOnce, LVariableTable*
variables, Globals *globals) {
PSEUDOMAIN_INJECTION(run_init::/home/isuzuki/dev/php/hello.php, pm_php$$ho
me$isuzuki$dev$php$hello_php);
LVariableTable *gVariables ATTRIBUTE_UNUSED = (LVariableTable *)g;
echo(NAMSTR(s_ssedffcbbc, "HipHop for PHP\n"));
echo(NAMSTR(s_ssc9bf8a1a, "Hello World\n"));
return true;
}
namespace hphp_impl_splitter {}

////////////////////////////////////////////////////////////////////////////
///
}


/tmp/hphp/php/home/isuzuki/dev/php/hello.fws.h


#ifndef __GENERATED_php__home_isuzuki_dev_php_hello_fws_h6d9aa4dd__
#define __GENERATED_php__home_isuzuki_dev_php_hello_fws_h6d9aa4dd__


namespace HPHP {
////////////////////////////////////////////////////////////////////////////
///

// 1. Static Strings
extern StaticString s_ssc9bf8a1a;
extern StaticString s_ssedffcbbc;

// 2. Static Arrays

// 3. Static Variants





////////////////////////////////////////////////////////////////////////////
///
}


#endif // __GENERATED_php__home_isuzuki_dev_php_hello_fws_h6d9aa4dd__


/tmp/hphp/php/home/isuzuki/dev/php/hello.h


#ifndef __GENERATED_php__home_isuzuki_dev_php_hello_h344dcfd5__
#define __GENERATED_php__home_isuzuki_dev_php_hello_h344dcfd5__


// Declarations

namespace HPHP {
////////////////////////////////////////////////////////////////////////////
///

// Includes and Functions
Variant pm_php$$home$isuzuki$dev$php$hello_php(bool incOnce, LVariableTable*
variables, Globals *globals);

// Constants

////////////////////////////////////////////////////////////////////////////
///
}

#endif // __GENERATED_php__home_isuzuki_dev_php_hello_h344dcfd5__


このようなソースができていました。
これで、インストールは完了したので、今後色々と使ってみようと思います。

2012年3月1日木曜日

ファイルダウンロード

PHPでcsvファイルをダウンロードするサンプルプログラムを作成してみました。

最初のソースはファイルを作成して、ダウンロードさせるパターンです。
ファイル内容が、膨大な量になる時はこちらの方法がいいのかと思います。
<?php
$file = '/tmp/file.csv.' .getmypid();
$fp = fopen($file, 'w');
if ($fp === false) {
error_log('file open error');
exit(1);
}

$header = array('num',
'line',
'data',
);
fputcsv($fp, $header);

for($i=1;$i<=100;$i++) {
$line = array($i,
'line' . $i,
'data' . $i,
);
fputcsv($fp, $line);
}

fclose($fp);

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="download.csv"');
header('Content-Length: '.filesize($file));
readfile($file);

@unlink($file);
exit(0);



二つ目のソースは出力バッファを利用したものになります。
自分はファイルの内容問わず、ファイルを作成する方法でやっていたのですが、内容が大した量ではないときはこちらの方法の方が効率良いかと思います。
<?php
$fp = fopen('php://output', 'w');
if ($fp === false) {
error_log('file open error');
exit(1);
}

ob_start();
$header = array('num',
'line',
'data',
);
fputcsv($fp, $header);

for($i=1;$i<=100;$i++) {
$line = array($i,
'line' . $i,
'data' . $i,
);
fputcsv($fp, $line);
}

$str = ob_get_contents();
fclose($fp);
ob_end_clean();

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="download.csv"');
header('Content-Length: '.strlen($str));
echo $str;

exit(0);



入出力ストリームへのアクセスとか全然知らなかったので、非常に勉強になりました。
PHPマニュアル

2012年1月27日金曜日

PHP json_decode ではまったこと

配列をjsonに変換し、POSTした画面先で再度配列に直す処理を書いていたときにはまったこと。

json_decodeの第二引数を「true」にして連想配列にすれば良かったのですが、見逃していて自力で配列にキャストした時に、よくわからないことが起こりました。

自力で配列へのキャスト
<?php
$arr = array(1 => 'hoge',
'a' => 'fuga',
2 => 'piyo',
'b' => 1234,
);

$json = json_encode($arr);
var_dump($json);

$json_arr = (array)json_decode($json);
var_dump($json_arr);

foreach ($json_arr as $k => $v) {
var_dump($json_arr[$k]);
}


このコードの実行結果は以下の様になりました。



エラーが出るのでキーに「"1"」の文字列が入ったのかなとか思ったのですが、結局そのキーを指定しても、ダメでした。
結局なぜダメなのかはわからずですが、json_decodeの第二引数を「true」にした場合は、問題なかったのでそちらでやるようにしました。
原因知りたいですが、未だわからずです。


第二引数に「true」を師弟
<?php
$arr = array(1 => 'hoge',
'a' => 'fuga',
2 => 'piyo',
'b' => 1234,
);

$json = json_encode($arr);
var_dump($json);

$json_arr = json_decode($json, true);
var_dump($json_arr);

foreach ($json_arr as $k => $v) {
var_dump($json_arr[$k]);
var_dump($json_arr[(string)$k]);
}


このコードの実行結果は以下の様になりました。


jsonから配列に変換する時は、json_decodeを利用するとキーが数字の場合は、int型のキー配列に変換してくれるようです。

2011年11月21日月曜日

YUI3 でpanel表示

YUI3 を使って panel を表示するサンプルを作成。

javascript

YUI().use('panel', function(Y) {
var panel = new Y.Panel({
srcNode : '#sPanel',
centered : true,
render : true,
visible : false,
modal : true,
buttons : []
});

Y.one('#sPanelOpen').on('click', function(e) {
e.preventDefault();
panel.show();
});

Y.one('#sPanelClose').on('click', function(e) {
e.preventDefault();
panel.hide();
});
});


php

<html>
<head>
</head>
<title>YUI3.0サンプル</title>
<script src="http://yui.yahooapis.com/3.4.1/build/yui/yui-min.js"></script>
<script src="/sample.js"></script>
</head>
<body class="yui3-skin-sam">
<a href="" id="sPanelOpen">open</a></br>

<div id="sPanel">
<strong>サンプルパネル</strong></br>
<a href="" id="sPanelClose">close</a></br>
</div>

</body>
</html>


これで、open リンクをクリックすると panel が表示されます。
body に class="yui3-skin-sam" を設定すると panel 表示時に、背景を薄暗くできます。
panel は yui3.4 から利用できるようです。

サンプル画面


yuiドキュメント

自分はフロント系が苦手なので、もう少し js 、html に強くなるため YUI 関連も引き続き調べていこうと思います。

2011年11月14日月曜日

php goto文

PHP5.3からgoto文がサポートされた。
詳しくはマニュアルを
http://www.php.net/manual/ja/control-structures.goto.php

goto文はCやperlでもあります。
goto文はあまり使わないようにとされているようです。
確かに使い方を誤るともの凄くソースが読みづらくなります。
上から下に進んでいくのに、下から上にjumpするように書かれていたりなどしたら、ソースを読む時に処理を追い辛くてしょうがないですね。
エラー時や特定時のみ利用するのがいいみたいです。

特定時のみ使うのであれば有効かと思い、軽くパフォーマンスを見てみました。
結果は以下のようになっています。

goto文

<?php
$j = 0;
for ($i=0;$i<10000000;$i++) {
goto A;

A : {
$j++;
}
}

echo $j;
exit(0);

実行結果

$ time php goto.php
10000000
real 0m1.290s
user 0m1.152s
sys 0m0.036s


関数

<?php
$j = 0;
for ($i=0;$i<10000000;$i++) {
calc($j);
}

echo $j;
exit(0);

function calc(&$j) {
$j++;
}

実行結果

$ time php func.php
10000000
real 0m3.087s
user 0m2.760s
sys 0m0.052s


goto文の方が早いですね。
関数を呼ぶオーバヘッドが無いからかな?

一度の処理で、複数回のエラー処理をしないといけないときなどは、関数化するよりもgoto文を使うのもありかもですね。

2011年11月10日木曜日

ubuntu に apache + php インストール

昨日インストールした vm 上の ubuntu に apache と php をインストールします。

apache インストール

1. sudo apt-get install apache2
→ 途中でインストールするか Y/n で聞かれるので、Y を入力

2. dpkg -l | grep apache (表示内容一部省略)
apache2
apache2-mpm-worker
apache2-utils
apache2.2-bin
apache2.2-common


※ dpkg -L apache2 の結果
/.
/usr
/usr/share
/usr/share/bug
/usr/share/bug/apache2
/usr/share/bug/apache2/control
/usr/share/doc
/usr/share/bug/apache2/script
/usr/share/doc/apache2


3. ブラウザで確認

上記画像の用に表示されれば、apache のインストール完了


php インストール

1. sudo apt-get install php5
→ apache の時と同じく Y を入力

2. dpkg -l | grep php (表示内容一部省略)
libapache2-mod-php5
php5
php5-cli
php5-common


※ dpkg -L php5 の結果
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/php5


3. php -v の結果
PHP 5.3.6-13ubuntu3.2 with Suhosin-Patch (cli) (built: Oct 13 2011 23:19:13)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies

php5.3.6 がインストールされるみたいです

4. ブラウザで定番の Hello World 出力
何も設定せずに、ブラウザで開こうとすると、php ファイルをダウンロードしますかみたいに表示される。
yas さんのブログを参考に設定したところ、無事表示されました。
http://perltips.twinkle.cc/linux/ubuntu/apache/php/settings


とりあえず、設定完了。


※ 補足
apache の再起動は以下のコマンドで可能
sudo /etc/init.d/apache2 restart