共用サーバにPEARライブラリの追加

使用している共用サーバ(Xserver)には標準で以下のPEARライブラリがインストールされている。

Archive_Tar、Auth、Console_Getopt、DB、HTML_Common
HTML_QuickForm、HTTP、HTTP_Header、HTTP_Download
Mail、Net_SMTP、Net_Socket、Pager、PEAR、XML_Parser
XML_RPC、Structures_Graph

未インストールPEARは、自分で自分のホームディレクトリ内にインストールして使用する必要がある。

手順は、以下です。

1.PEAR管理画面をインストール(PEAR基本のインストール)
(1)PEARライブラリを組み込むディレクトリをホームディレクトリ内に確保。
  インターネットからからアクセスできないところに確保するので、以下とした。
  /home/ユーザID/pear
  (注)ユーザIDはアカウント情報のサーバIDとなる。
 このデイレクトリには、777のアクセス情報を与える。

(2)上記のディレクトリにPEARをインストールするgo-pear.phpを、任意のディレクトリ(インターネットからアクセスできる)にコピー。
・任意のディレクトリは、自分しかアクセスできないアクセス制限を必ずかける。
・任意のデイレクトは例えば/home/ユーザID/ドメイン名/public_html/apearとする。
・go-pear.phpはhttp://pear.php.net/go-pearにアクセスして、表示内容をすべてコピーして、go-pear.phpを作成。/home/ユーザID/ドメイン名/public_html/apearにアップロードする。
(3)ブラウザでhttp://www.ドメイン名/apear/go-pear.phpを指定してインストールを開始。
 ・Next >>をクリック
(4)次の画面のConfigで次を指定して、Installボタンを押下。
 ・1.Instrarion Prefix           /home/ユーザID/pear
インストールが開始されます。
最後にWarning: Can not determine the URL of the freshly installed Web Frontend
(file: /home/ユーザID/pear/index.php).Please access it manually
が表示されるが、問題なし。
(5)PEAR管理画面を使うために、/home/ユーザID/pear/index.phpを/home/ユーザID/ドメイン名/public_html/apearにアップロードする。なお、次の修正をする。
 $pear_dir1= '/home/ユーザID/pear/PEAR'

以上で、PEAR管理画面が使用できる。

2.使用したいPEARライブリのインストール

http://www.ドメイン名/apear/index.php二アクセスすると、PEAR管理画面が表示されるので、検索窓で使用するPEARライブラリを検索する。

検索結果画面で、プラスマーク(+)をクリックして、インストールする。

3.phpプログラムでのPEARライブラリの使用
 以下を指定している。 

 ini_set('include_path','/home/ユーザID/pear/PEAR');

ログの出力

ログの出力
function write_log( $msg )
{ global $log_file ;
$fp=fopen($_SESSION['dir'].$_SESSION['folder']."/".$log_file,"a");
flock($fp,LOCK_EX);
fwrite($fp,date("Y/m/d H:i:s")." ".$_SERVER['REMOTE_ADDR']." ".$_SERVER['REMOTE_HOST'].$msg."\r\n");
flock($fp,LOCK_UN);
fclose($fp);
}

天気予報の表示

livedoor 天気情報を使用して、明日と明後日の天気予報を表示するPHPプログラムを作成しました。参考資料は「PHP5 XMLによるWebサービス構築」佐久嶋ひろみ著です。http://www.mone.jp/php/tenkiyoko.php
明日
曇のち雨
09日(月)の天気は曇のち雨、最高気温は16℃ 最低気温は11℃でしょう。
明後日
曇時々晴
10日(火)の天気は曇時々晴、最高気温は18℃ 最低気温は9℃でしょう。

の様に表示されます。ソースは、 <?php
 header ( "Content-Type: text/html; charset=UTF-8");?>
<?php
//PEARのパスを設定する (xserverレンタルサーバのため必須)
ini_set('include_path', '/home/userID/pear/PEAR');
require_once "XML/RSS.php"; // RSSフィードを読み込んでパースする
$feed_url = "http://weather.livedoor.com/forecast/rss/14/70.xml";
$rss = new XML_RSS($feed_url);
$result = $rss->parse();
if (PEAR::isError($result)) {
  exit($result->message);
}

$item=$rss->getItems();
$imag=$rss->getImages();
?>
<div class="tenkiyoko">
<TABLE class="tenki" border="1">
  <TBODY>
    <TR>
      <TD>明日</TD>
      <TD><img src="<?= $imag[3]['url']?>"><br/><?=$imag[3]['title'] ?></TD>
      <TD><?= $item[2]['description']?></TD>
    </TR>
    <TR>
      <TD>明後日</TD>
      <TD><img src="<?= $imag[4]['url']?>"><br/><?=$imag[4]['title'] ?></TD>
      <TD><?= $item[3]['description']?></TD>
    </TR>
  </TBODY>
</TABLE>
</div>
です。 livedoor 天気情報はRSS2.0で、PearのRSS.phpはRSS1.0なので、イメージと項目の添字が1つづれます。でも、まあまあ、上出来です。

ブラウザで日本語が化ける

HtmlのドキュメントをPHP化して、コンテンツを動的にしようと思い、識別子をPHPに変更しました。ところが日本語が化けてしまいました。
でUTF-8は指定しています。
ブラウザで、エンコードを見てみると、日本語(シフト JIS)になっていました。
wwwサーバapacheのデフォルト文字セットが日本語(シフト JIS)になっているのが原因(ヘッダでの指定が(シフト JIS))とおもい、PHPでヘッダを変更できるか調査しました。
先頭に
header ( "Content-Type: text/html; charset=UTF-8");
?>
で可能です。
ブラウザでの表示も問題ありません。

DomDocumentクラスがNotFound

Fedora5では
yum install php-dom
で使えようになりました。
SOモジュールが追加されていました。

エラー制御演算子@

エラー制御演算子@はエラーメッセージを表示した無いときに使います。
 たとえば
   @fopen(......
   @$_SERVER['HTTP_REFERER'](.......
などです。

直近のエラーメッセージは$php_errormsgに格納されています。ただし、
track_errors  (boolean)を有効にした場合です。

セキュリティ対策

プログラムを更改することになり、セキュリティ関連の情報を探していたのですが、本屋さんで下記の本が見つかりました。
PHPはperlに比べて使いやすいのですが、落とし穴も多くあるんですね!

php で checkbox を使う

PHPでチェックボックスを使うには、
<INPUT type="radio" name="del[]" value="<?php echo $orders[$i][2]; >">
を使用します。
<INPUT type="radio" name="del" value="<?php echo $orders[$i][2]; ?>">
だと、チェックされた最後のVauleだけが、返されてしまいます。
ただし、name="del[]" は、IEのjavascriptでは
if (document.myform.del[i].checked) {st}
がエラーとなります。document.myform.delがNullなどのエラーです。
仕様のようで、回避策はないようです。

追伸
 javascriptでは、チェックボックスが1つのときは
if (document.myform.del[i].checked) {st}
がエラーです。
if (document.myform.del.checked) {st}
とする必要がありました。

array-search関数の注意点

配列要素を検索するにはarray-searchを使用します。
しかし、0番目の要素で検索が成功すると、結果が0となりますため、
型まで判定に加えないと、falseとなってしまいます。
 if (array-search("aaa",$array)===false) { st}}
とします。
 if (array-search("aaa",$array)==false) { st} }
だと、0番目だとstが実行されます。

文字を数値に変換

入力した数字を数値に変換する方法を探していました。
 PHPのマニュアルを探しても見つからず、検索で。。。。
  intval()
 でした。
 文法で関数の章にあるが探さな
かったです。

ファイル名か空白の削除

ImageMagickのコマンドラインでは、空白を含むイメージ名は処理できませんので
空白を削除します

$fname=str_replace(array(" "," "),"",$fname);

Tips(#1)

(1)マジッククオートの扱い(標準はOff)
php.ini-distではOnになっています・
; Magic quotes for incoming GET/POST/Cookie data.
;magic_quotes_gpc = On
magic_quotes_gpc = Off

ZIPファイルを造る(Arichive_Zip)

Arichive_Zipを使用します。下記を参照ください。
http://pear.php.net/package/Archive_Zip/

$zip = new Archive_Zip("aaaa");
$zip=>add("file1");

で造れます。

定義済の変数を知るには

PHPマニュアル
http://jp2.php.net/manual/ja/index.php
の付録 予約語の一覧
http://jp2.php.net/manual/ja/reserved.php
の定義済みの変数
http://jp2.php.net/manual/ja/reserved.variables.php
を参照してください。

ImageMagickを使う

サムネイム処理のため、画像処理するのですが、GDだとサムネイムが時々
不満足な写真となります。
そのため、LinuxではImageMagickのConvertコマンドを使っていました。
Windowsでは、WIndowsのバイナリー版を使いました。
ImageMagick-6.2.5-4-Q16-windows-dll.exe
2つ問題があります。
(1)標準ではProgram Fileにインストールされる
(2)Windowsには標準にconvertコマンドがある
ため、Linuxのソースをそのまま使えません。

そのため、下記を行いました。(二日ほど要しました)
(1)ファイル名に空白を含ま無いに例えば
  D:\ImageMagick
にインストールしました。
(2)コマンド名を下記としました
d:\ImageMagick\convert.exe 
(3)コマンド名には  \を使用します
ただし、画像などのファイルには、Linuxと同じで / です。

以上で、Linixと同じことができるようになりました。

日本語(シフトJIS)で使う

Windowsでプログムの開発していると、シフトJISが便利なので
その設定を行います。
以前は、MySqlでしたのでEUCを使用していました。
シフトJISでもデータベースもも含めて日本語が正しく処理されています。
(PHP5の効果かも?)
PHP.iniの設定は

mbstring.language = Japanese
mbstring.internal_encoding = SJIS
mbstring.http_input = auto
mbstring.http_output = SJIS

としました。

写真処理モジュールの追加(php.iniの編集)

写真処理するため、Jpegのヘッダを扱う必要があるため、Exif拡張関数が必要となります。
Php.iniを編集します。
最初は、
; Maximum allowed size for uploaded files.
upload_max_filesize = 8M
; Directory in which the loadable extensions (modules) reside.
extension_dir = "C:/php/ext"
;Windows Extensions
extension=php_exif.dll
extension=php_gd2.dll
としていましたが、apacheの再起動でフリーズを繰り返しました。
(設定を色々変更しました、旨くいきませんでした)
Phpのマニュアルを読み直し、Exif拡張関数はマルチバイト文字列関数(mbstring)が
必要とのことでしたので
extension=php_mbstring.dll
を追加しました。
apacheの起動も正常となり、
php phpinfo();
の表示でも
EXIF Support enabled
EXIF Version 1.4 $Id: exif.c,v 1.162.2.9 2005/08/05 14:00:47 hyanantha Exp $
Supported EXIF Version 0220
Supported filetypes JPEG,TIFF
を確認できました。
なお、標準で
SQLite
も使えるようです。

Windowsで使用する

WIndows2003サーバでPHP5を使用します。
(Fedora4で動作していたプログラムを移植します)
WWWサーバは、IISでなくApacheを使用します。
1.Apacheの時は、手動で設定する必要があります。
詳しくは、PHP マニュアルhttp://jp2.php.net/manual/ja/index.php
Ⅱインストールと設定=>、6章Windowsシステムへのインストールを参照してください。
2.PHP5インストール
(1)apacheのインストール
Apache Software FoundationDownloadページから最新版をDownloadします。
Downloadしたファイルapache_2.0.55-win32-x86-no_ssl.msiをインストールします。
(2)PHP5のパッケージをDownload
PHP本家のDownloadページからWindows Binaries PHP 5.0.5 zip packageをdownloadします。
IISなどはインストーラ版がありますが、Apcheはこのパッケージとなります。
(3)解凍
パッケージはZIP形式の圧縮ファイルですので、WindowsXpやWindows2003では、ダブルクリックして
開き、C:\php ディレクトリを作成し、コピーします。
(4)設定(apache)
CGI バイナリ、CLI バイナリ、およびサーバモジュールは使用しないので、 php4ts.dll を必要としません。
apacheの設定だけで、使用できるようになります。
apacheのHttpd.confに以下行を追加します。
include conf/php.conf
php.confには、下記の内容を記述します。php.confはhttpd.confと同じディレクトリに作ります。
# PHP 5 のモジュール追加
LoadModule php5_module "c:/php/php5apache2.dll"

#マイムタイプの追加
AddType application/x-httpd-php .php
#又は(コンテンツネゴシエーションを許す)マイムタイプの追加====>こちらが最新
AddHandler php5-script .php
AddType text/html .php

#ディレクトリインデックスの追加
DirectoryIndex index.php
# php.ini の場所を設定
PHPIniDir "C:/php"

php.ini は、C:\phpにあるphp.ini-dist かphp.ini-recommended(デフォルトの php.ini 設定)
をコピーしてphp.iniとします。開発時には、php.ini-distを使用する様です。
(5)設定(PHP)
ph.iniは変更無しでも利用可能です。
(6)テスト
php phpinfo();
のPhpプログラムをブラウザから実行します。
インストールされた内容が表示されれば、正しくインストールされました。

実際のphp.iniの設定は次回です。

HTMLディレクトリにデータを

データをhtmlディレクトリ内に置くには
html
|-dataディレクトリ
|-db-ac1
   |-.htaccess
|-スクリプト

スクリプト
 sqlite_open("./data/db-ac1")
.htaccess
 order deny,allow
 deny from all
とすれば、ブラウザからはアクセスできません。

getcwd()

カレントディレクトリを返します。
アパッチでPHPを使用しているときは、PHPスクリプトのディレクトリです。