PHPでCRONからPEARが実行されない・・・
ある日突然、CRONにセットしてある特定のファイルのみ実行されなくなった。。。
原因を解明していると、どうやらPEARのファイルをインクルードしている行で、それ以降のプログラムが実行されていないようだった。
この前まで動いていて、CRONにセットしている内容を直接コマンドで打ち込んでも正常に実行され、他のサーバーでほぼ同じ環境、同じプログラムが既に問題なく動き続けていたので、本当に謎過ぎて解決までかなりの時間がかかったので、メモっておきます。
ネットで調べてみると、同じ現象に苦しんでいる人も沢山いるようで、でも明確な解決法があまりないので色々試行錯誤した結果、以下の方法でいけました。
結論
require_once('/var/www/html/pear/PEAR/Mail/mimeDecode.php');
で、プログラムがストップしてたのを
↓
ini_set("include_path", ".:/var/www/html/pear/PEAR" . PATH_SEPARATOR . ini_get("include_path") );
require_once('/var/www/html/pear/PEAR/Mail/mimeDecode.php');
こうしたらうまくいった。
どうやらphp.iniの
include_path=".:/var/www/html/pear/PEAR"
が、CRONの自動実行でなんかしらうまく読み込まれてい感じがしました。
JavaScriptでFromタグ内のものを別ウィンドウで開く
入力項目があるページ内に、「登録」と「プレビュー」と2つのボタンを配置してプレビューを押したときにだけ、別ウィンドウで登録する予定の内容を確認できる~みたいなのを作りたくて探しまくったが、なかなかこれぞというのが見つからなく、自分で無理やり作ってみました。
無理やり作ったので無駄なことしてるかもしれません。
━GET送信の場合━━━━━━━━━
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<title>サンプル</title>
<script type="text/javascript">
<!--
function openwin() {
var str = document.getElementById("test").value;
window.open("./test.php?test=" + str, "");
}
// -->
</script>
</head>
<body>
<form method="GET" action="reg.php">
<input type="text" name="test" id="test" value="<?php print$_GET['test']; ?>">
<input type="submit" value="決定">
<input type="button" value="テスト表示" onclick="openwin();">
</form>
</script>
</body>
</html>
━POST送信の場合(こっちが実用的かと)━━━━━━━━━
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<title>サンプル</title>
<script type="text/javascript">
<!--
function openwin() {
window.open("","PREVIEW");
window.document.inform.action = "test.php";
window.document.inform.target = "PREVIEW";
window.document.inform.method = "POST";
window.document.inform.submit();
}
function send() {
res = confirm("この内容で登録します。");
if(res == false) {
return false;
}else{
window.document.inform.action = "reg.php";
window.document.inform.target = "";
window.document.inform.method = "POST";
window.document.inform.submit();
}
}
// -->
</script>
</head>
<body>
<?php
if($_POST['test']){
print('登録しました');
}
?>
<form name="inform" method="POST" action="reg.php">
<input type="text" name="test" id="test" value="<?php print$_POST['test']; ?>">
<input type="submit" value="決定" onclick="send();">
<input type="button" value="テスト表示" onclick="openwin();">
</form>
</script>
</body>
</html>
日本語と英字が混ざった文字列ソート
普通にやると何故か苦労したのでメモっときます。
まず、濁点や英字などが混じった文字列を日本語をメインにソートすると、濁点文字は50音順で最下部になったり、英字が50音より前に入ったりと、使いづらい状態になります。
以下のようなデータをソートした場合
$data[0][0] = '1';
$data[0][1] = 'ヴァイオリン';
$data[1][0] = '2';
$data[1][1] = 'ラリルレロ';
$data[2][0] = '3';
$data[2][1] = 'abcdef';
3 abcdef
2 ラリルレロ
1 ヴァイオリン
となってしまうので、以下の形式になるよう組み替えます
1 ヴァイオリン
2 ラリルレロ
3 abcdef
//濁点を50音順で正しくソートする
foreach($data as $key => $row){
$temp = mb_convert_kana($row[1],"k", "Shift_JIS"); //半角カタカナにする
$temp = mb_ereg_replace("゙|゚","",$temp); //半角カタカナにすると濁点や半濁点が一時になるので消去
$temp = mb_convert_kana($temp,"K", "Shift_JIS"); //全角カタカナにする
$name[$key] = $temp;
}
array_multisort($name,SORT_ASC,$data);
//英字だった場合は配列の後に付ける
$i = 0;
$data_zenkaku = array();
$data_hankaku = array();
foreach($data as $value){
if(mb_ereg("^[a-zA-Z\._-]", $value[1])){
$data_hankaku[$i][0] = $value[0];
$data_hankaku[$i][1] = $value[1];
}else{
$data_zenkaku[$i][0] = $value[0];
$data_zenkaku[$i][1] = $value[1];
}
$i++;
}
$data = array_merge_recursive($data_zenkaku, $data_hankaku);
print_r($data);