2013-04-03

PHPで非同期処理

こんな感じで開始時刻をミリ秒ではいて、5秒間待つだけの処理を

test_mulitproc.php
<?php
list($microSec, $timeStamp) = explode(" ", microtime());
error_log(date('Y-m-d H:i:', $timeStamp) . (date('s', $timeStamp) + $microSec));
sleep(5);



同じくこんな感じで実行してみると

test_multiexec.php
<?php
error_log('同期処理開始');
exec('php /var/www/test_multiproc.php 1> /dev/null 2>&1');
exec('php /var/www/test_multiproc.php 1> /dev/null 2>&1');
exec('php /var/www/test_multiproc.php 1> /dev/null 2>&1');
exec('php /var/www/test_multiproc.php 1> /dev/null 2>&1');
exec('php /var/www/test_multiproc.php 1> /dev/null 2>&1');
error_log('非同期処理開始');
exec('nohup php /var/www/test_multiproc.php > /dev/null &');
exec('nohup php /var/www/test_multiproc.php > /dev/null &');
exec('nohup php /var/www/test_multiproc.php > /dev/null &');
exec('nohup php /var/www/test_multiproc.php > /dev/null &');
exec('nohup php /var/www/test_multiproc.php > /dev/null &');



実行結果はこんな感じ。

[01-Apr-2013 20:28:30] 同期処理開始
[01-Apr-2013 20:28:30] 2013-04-01 20:28:30.742573
[01-Apr-2013 20:28:35] 2013-04-01 20:28:36.031054
[01-Apr-2013 20:28:40] 2013-04-01 20:28:41.291464
[01-Apr-2013 20:28:46] 2013-04-01 20:28:46.56506
[01-Apr-2013 20:28:51] 2013-04-01 20:28:51.827265
[01-Apr-2013 20:28:56] 非同期処理開始
[01-Apr-2013 20:28:57] 2013-04-01 20:28:57.468525
[01-Apr-2013 20:28:57] 2013-04-01 20:28:57.616613
[01-Apr-2013 20:28:57] 2013-04-01 20:28:57.644256
[01-Apr-2013 20:28:57] 2013-04-01 20:28:57.69278
[01-Apr-2013 20:28:57] 2013-04-01 20:28:57.70006

2013-03-20

MTAとMUAと配信と転送と中継

メールのおべんきょ。


MTA(Mail Tranfer Agent)
メールを配信したり転送を行うプログラムのこと。メールサーバはこの機能を有している。


MUA(Mail User Agent)
MTA機能を持たず、ユーザのフロントエンドとして、電子メールの表示や読み書き、そしてメールサーバへの送信やサーバの自分のメールボックスからのメールの受信に専念するプログラム。


配信(delivery)
MTAが自分の所のローカルユーザーのメールボックスへメールを送る事を「配信」と言
う。



転送(transport)
送信先が自分の所のローカルユーザーでない場合、他のメールサーバーへメールを送る必要がある。MTAが他のメールサーバーへメールを送る事を「転送」と言う。


中継(relay)
MTAが、MUAや他のMTAからのメールを「転送」することを「中継」という。


とこんな感じかな。

転送と中継の説明がなってないような気がするが...

ツッコミよろしくです。

2013-03-18

そのまま移行してやがった

...だめだ、ここ。

昔のソース、そのまま移行してやがった。

外部入力値は、htmlspecialchars()通すか、htmlentities()通すかのどっちかなのに、

昔のソースそのまま移行してあったから(っていうか、昔も間違ってんだけど)

stripslashes()通した結果に対して、

「"」を「&quote;」にreplace()してた。

呆れてものもいえない。

2013-03-15

何もかもが中途半端

もう少し深いところで仕事がしたい。

あれもこれも何もかも一人でこなす

そんなスーパーな人材を

400万で雇おうなんて

都合が良すぎる。

2013-02-28

PHPで2重ポスト対策 その2 同一ページ内で処理

流れのサンプルなので、XSSとかSQLインジェクションとか考慮してません。

なので、使うときは考慮してね。

<?php
$act    = isset($_POST['act'])  ? $_POST['act']  : 'init';
$data   = isset($_POST['data']) ? $_POST['data'] : '';
$ticket = '';

session_start();

//  初期化処理
if ($act == 'init') {
    $act = 'check';
}
//  チェック処理
else if (($act == 'check') || ($act == 'regist')) {
    if (チェック処理正常) {
        $act = 'regist';
        $ticket = time();
        $_SESSION['ticket'] = $ticket;
    }
    //  登録処理
    else {
        //  2重ポスト時
        if (empty($_SESSION['ticket'])) {
            //  2重ポストされたときの処理
        }
        //  不正なポスト時
        else if ($ticket != $_SESSION['ticket']) {
            //  不正な処理
        }
        //  正常なポスト時
        else {
            //  先にチケットを空にする
            unset($_SESSION['ticket']);

            //  登録処理
            if (登録処理正常) {
                header("Location: 登録完了ページのURL", true, 303);
                exit();
            }
            else {
            }
        }
    }
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>sample</title>
<meta name="keywords" content="">
<meta name="description" content="">
</head>
<body>
<form method="post">
<input type="text"   name="data"   value="<?php echo $data ?>">
<input type="submit" value="<?php echo $caption ?>">
<input type="hidden" name="ticket" value="<?php echo $ticket ?>">
<input type="hidden" name="act"    value="<?php echo $act ?>">
</form>
</body>
</html>

2013-02-23

リクエストはキャンセルできない

基本的なことを知らなかった。


<?php
$fp = fopen('/var/tmp/hoge.txt', 'wb');
for ($i = 0; $i < 1000; $i++) {
    //  カウンタをファイルへ出力
    fwrite($fp, "{$i}\n");
    //  1秒待機
    sleep(1);
}



千秒カウントし、カウンタをファイルに出力するPGを作ってみた。

このPGへブラウザからアクセスして、途中で [ Esc ] キーでキャンセルした。



つもりだった。



で、サーバー上のファイルを less コマンドで開いて [Shift] + G で何気に表示を更新していたら、ファイルにカウンタが出力され続けていた。



・・・一度受け付けたリクエストは、サーバー上で処理が終わるか、サービスが再起動されるまで処理され続けることがわかった。





知らなかったおれ、恥ずかしい・・・

2013-02-19

postgresqlでシーケンスの一覧を取得する

SELECT relname 
FROM pg_class AS c 
JOIN pg_namespace AS n 
ON (c.relnamespace = n.oid) 
WHERE c.relkind = 'S' 
AND n.nspname = 'public';

Windows 11 インストール / アップグレード 手順

 Microsoftから、Windows 11 の ISO をダウンロード ダウンロードしたISOを右クリックしてマウント コマンドプロンプトを起動してマウントしたドライブ(D:とか)に移動し、setup /product server を実行 あとは指示に従うだけ これだけ。 ...