6.Webページの処理他
PHPではファイルを扱う多くの関数において、httpやftp アドレスを使用することができます。
以下の方法でWEBページを表示できます。
注意 Windows上では、リモート(外部)ファイルに include() および require() 文を使用することはできません。つまり1の方法は使えません。またレンタルサーバによっては禁止している場合があります。
1. includeやrequire関数で読みコム
include("http://www.yahoo.co.jp/index.html");
require("http://www.yahoo.co.jp/index.html");
・違いは?
☆ include - 読み込めなくてもスルー
☆ require - 読み込めないと中止
2. readfile関数で出力する
$byte = @readfile("http://www.yahoo.co.jp/index.html");
$byteにバイト数が入ります。関数のあたまに「@」をつけるとエラーメッセージを抑止できますよ。
3. ファイル読み込み的に1024バイト or 改行ずつ取得する
$fp = fopen("http://www.yahoo.co.jp/index.html", "r");
while (!feof($fp)) {
echo fgets($fp, 1024);
}
fclose($fp);
4. file関数で一気に配列に読み込む
$arr = file("http://php.s3.to/i.php");
// print_r($arr);
foreach ($arr as $line) {
echo $line;
}
配列の1要素は、改行までとなってます。foreachで配列を分解しています。
5. file_get_contents関数で一気に変数に読み込む
$val = file_get_contents("http://blog.livedoor.com/");
echo $val;
PHP4.3.0以降から使える関数で、いまヤン具に人気の方法です。
file関数は配列に読み込みますが、file_get_contents関数は変数に読み込みます。臨機応変で
PHP5からは、file_put_contents関数ってのも使えます
6. fsockopen関数で、ネットワーク的に取得する
$fp = @fsockopen("www.2ch.net", 80);
if($fp){
fputs($fp, "GET /test/dat/2.dat HTTP/1.0\r\n");
fputs($fp, "User-Agent: Monazilla/1.0+kage/1.0\r\n\r\n");
while (!feof($fp) && $o != "\r\n")
$o = fgets($fp, 512);
while (!feof($fp))
echo fgets($fp, 4096);
fclose($fp);
}
80番ポートを叩くとかいうヤツですね。ブラウザ名をアレコレしたり、クッキー送信や、ベーシック認証も出来ますよ。
TOMOさんのサイトが詳しいです。
7. PEARのHTTP_Requestでサクッと取得する
// 自フォルダの場合 require_once('Request.php');
require_once "HTTP/Request.php";
$req =& new HTTP_Request("http://www.yahoo.com/");
if (!PEAR::isError($req->sendRequest())) {
echo $req->getResponseBody();
}
コマンドラインから「pear install HTTP_Request」でインストール可能です。
応用次第でいろいろなことに使えるので、マニュアルを見てみて下さい。
Yahoo株価情報の取得と並び替え
実行例
ソースの一部分
if (mb_ereg("始値([0-9,]+)高値([0-9,]+)安値([0-9,]+)", $l, $v)) {
$out[$i][open] = $v[1];
$out[$i][high] = $v[2];
$out[$i][low] = $v[3];
}
ログイン情報をクッキーで保存するサイトから、クッキーを取得し、送信しよう
PEARのHTTP_Requestを使ったmixiログインの例
ソース
画像の保存場所が異なる場合、FTPを使って書き込んでみましょう。この場合、相手サーバにはFTPのアクセス許可が必要になります。
$body = "画像データ";
$fp = fopen("ftp://homepage:FTPパス@192.168.ホスト名/public_html/g/$fname", "w");
fputs($fp,$body);
fclose($fp);
まずはHTMLファイル(or URL)の中からリンクを抜き出す方法を考えましょう。要はページの中の<a href="http://〜の部分を見つければいいですね。
以下がソースですが、正規表現の部分はあまり深く考えないでいいです。意味は文中のhref="http://????"からhttp://????を抜き出すものです。
<?php
// ターゲットのファイル名(URLでも可)
$filename = "tt6.php";
// ファイルを開き配列に格納して、一行ずつ展開
$page = file($filename);
foreach ($page as $line) {
if (preg_match("/\bhref\s*=\s*[\"']?(http:\/\/[^\s\"'>]*)/i",$line,$reg)) {
echo "$reg[1]<br>";
}
}
?>
サンプル
マニュアルのまんまですが、、、アップロードフォームのHTML
<form enctype="multipart/form-data" action="up.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<input name="upfile" type="file" />
<input type="submit" value="送信する" />
</form>
「name="MAX_FILE_SIZE" value="30000" 」の部分はファイルサイズ制限バイト数です。<input type="file"の前に置いてください。
制限バイト数はフォーム上での制限なので、厳密には$_FILES['upfile']['size']でチェックするとよろしいかと思います。
投稿処理の部分
// 保存ディレクトリの設定(書き込み権限を与える)
$up_dir = './img-box/';
// 保存場所を決定する(元のファイル名部分を使用)
$up_name = basename($_FILES['upfile']['name']);
$up_file = $up_dir . $up_name;
// アップファイルは一旦/tmp/dh32hfdjhなどに保存されるので、
// move_uploaded_file関数で保存ディレクトリに安全に移動させる。
if (!move_uploaded_file($_FILES['upfile']['tmp_name'], $up_file)) {
die ("アップロード攻撃!かも?!");
}
// 保存に成功したら、ログなどの書き込み処理〜〜〜
// $dat = "$id|$up_name|\n";
アップロード関係のphp.iniの項目
PHPのデフォルトでは、2メガまでしかアップロードできない仕様ですので大きなファイルをアップロードするときには、php.iniの設定の変更が必要となります。
<? phpinfo() ?>を表示させて確認してください。
関係ありそうな項目
- file_uploads (デフォルト:1)
ファイルアップロードを有効にするかどうか?
-
memory_limit (デフォルト:8M) --enable-memory-limitでインストールした場合のみ
PHPが確保できる最大メモリ数
-
max_execution_time (デフォルト:30)
スクリプトの最大実行時間
-
open_basedir (デフォルト:空)
ファイルが開けるディレクトリの制限。move_uploaded_file関数でなくcopy関数でアップロードファイルを移動させようとするとひっかかる場合あり
-
post_max_size (デフォルト:8M)
POSTデータに許可できる最大サイズ
-
upload_max_filesize (デフォルト:2M)
アップロードできるファイルの最大サイズ。8メガまでならここを変更すればよい
-
upload_tmp_dir (デフォルト:/tmp/)
アップロード時に一時保存に用いるディレクトリ
10メガとか大きなファイルをアップロードできるようにする為には、「 post_max_size > upload_max_filesize」となるようにして下さい。設定変更後はhttpdを再起動してphpinfo()で変更を確認しましょう。
<?php
$target = dirname($_SERVER["SCRIPT_FILENAME"]);
if ($dh = opendir($target)) {
while (($filename = readdir($dh)) !== false) {
if ($filename != "." && $filename != "..") {
echo "$filename<br>";
//$day = date("Y-m-d H:i", filemtime($filename));
//$size = filesize($filename) / 1024;
//printf("% -24s %-s %1.1fK\n<br>", $filename, $day, $size);
}
}
closedir($dh);
}
?>
サンプル ソース
PHPは関数が多すぎて、目的までたどり着く前に迷子になってしまいますよね。
ここでは埋もれた関数の中から「こんなんあったの?!」ってなモノを気まぐれに紹介していくコーナーです。
・disk_free_space - ディレクトリの空き容量が分かる!
・glob - パターンマッチでファイル検索が出来る!*.txtとか
「これ知ってるゥ?」とか「こんなの無いかな?」を募集中!! 下↓に書いてくださいませ
$logfile="tt6";include("short.php");?> |
<<Prev Next>>
LastModified