SQLの窓

2014年08月01日


PHP : リモートのファイルサイズを取得する

PHP のオンラインマニュアルの投稿データにあります。
<?php
$remoteFile = '対象 URL(http)';
$ch = curl_init($remoteFile);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
  echo 'cURL failed';
  exit;
}

$contentLength = 'unknown';
$status = 'unknown';
if (preg_match('/^HTTP\/1\.[01] (\d\d\d)/', $data, $matches)) {
  $status = (int)$matches[1];
}
if (preg_match('/Content-Length: (\d+)/', $data, $matches)) {
  $contentLength = (int)$matches[1];
}

echo 'HTTP Status: ' . $status . "\n";
echo 'Content-Length: ' . $contentLength;
?>
Here's the best way (that I've found) to get the size of a remote file
なんて書いてあるのですが、確かにうまくいきます。当たり前と言えばあたりまえですが、An HTTPD でログを取るとこんな感じです。
<<< s=300: Fri Sep 18 23:30:20 2009 <<<
HEAD /php/elenat.ttf HTTP/1.1
Host: localhost
Accept: */*

>>> s=300: Fri Sep 18 23:30:20 2009 >>>
HTTP/1.1 200 Document follows
MIME-Version: 1.0
Server: AnWeb/1.42p
Date: Fri, 18 Sep 2009 14:30:20 GMT
Content-Type: application/octet-stream
Accept-Ranges: bytes
Content-Length: 5116536
ETag: "43a96df0-4e1278"
Last-Modified: Wed, 21 Dec 2005 15:00:00 GMT
レスポンスはすぐに返ってきます。実際使う場合は、curl が使えるか事前にチェックする必要がありますが、たぶん大丈夫でしょう。ですが、Windows の場合は意図的に使えるようにする必要があります(php.ini でextension=php_curl.dll)。こちらは、実際にそのへんを考慮して作ったサンプルです
posted by lightbox at 2014-08-01 12:17 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2014年07月31日


PHP : cURL で FTP + SSL ダウンロード

サンプルは、PHP のオンラインマニュアルの投稿部分にあります。この、「投稿部分」には昔から結構重要な情報が掲載されています。特に、SSL についてはマニュアル本文に無いパラメータがあり、libcurl.a の Cドキュメントからの参照が記述されています。(実際、本文のパラメータだけは SSL にはなりませんでした)

以下は、コマンドプロンプトからの実行を想定していますので、実行は以下のようになります。
php.exe ftp_ssl_download.php

また、Windows では、php.ini で extension=php_curl.dll が必要です。実際、SSL が使われたかどうかの確認は、debug.txt を参照して確認できます。

ftp_ssl_download.php
<?php
// ************************************
// ユーザとパスワード
// ************************************
$username = 'ユーザ';
$password = 'パスワード';

// ************************************
// 対象ファイル
// ログインディレクトリからの相対位置
// ************************************
$url = 'winofsql.jp/www/homepage/download/WinOfSql102.zip';

// ************************************
// URL
// ************************************
$ftp_server = "ftp://" . $username . ":" . $password . "@" . $url;

// ************************************
// 開始
// ************************************
$ch = curl_init();

// ************************************
// デバッグ用の詳しいメッセージを出力
// ************************************
curl_setopt($ch, CURLOPT_VERBOSE, true); 
$fpe = fopen("./debug.txt","w");
curl_setopt($ch, CURLOPT_STDERR, $fpe);

// ************************************
// 転送用のオプション
// ************************************
curl_setopt($ch, CURLOPT_URL, $ftp_server);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

// ************************************
// SSL である事の明示
// ※ CURLFTPSSL_ALL と CURLFTPSSL_TRY があります
// ************************************
curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_ALL);

// ************************************
// ダウンロードされるファイル
// ************************************
$fp = fopen("./target.zip","w");
curl_setopt($ch, CURLOPT_FILE, $fp);

// ************************************
// 実行
// ************************************
$result = curl_exec($ch);
if($result === false) {
	$result = 'Curl error: ' . curl_error($curl);
}

// ************************************
// 終了
// ************************************
curl_close($ch);

// ************************************
// 後処理
// ************************************
fclose($fp);
fclose($fpe);

print $result . "\n";
?>
OK





タグ:PHP Curl 通信
posted by lightbox at 2014-07-31 14:14 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2014年07月30日


ローカルの PHP を使ってコマンドプロンプトより簡単にバイナリファイルをアップロードする

PHP の簡単なコードへ向けて、データをアップロードします。PHP のコードは、『VBscript(または JScript) で簡単にバイナリファイルをアップロードする』を参照して下さい。

コマンドプロンプトからは以下のようにして実行します。
php.exe curl_put.php

cURL 関数を使用するには、Windows では、php.ini で extension=php_curl.dll が必要です。また、ここでは使用していませんが、https に対して実行する場合は、24行と25行のコメントを外して下さい

curl_put.php
<?php
// ***********************
// curl 処理
// ***********************
$curl = curl_init();
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, "http://yourdomian/put/put.php");
curl_setopt($curl, CURLOPT_PUT, true);

// ***********************
// 読み込むファイル
// ***********************
$file_path = "./winofsql.png";
curl_setopt($curl, CURLOPT_INFILESIZE, filesize ( $file_path ));
$handle = fopen($file_path, "r");
curl_setopt($curl, CURLOPT_INFILE, $handle);

// ***********************
// https 用
// ***********************
//curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
//curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

// ***********************
// 送信
// ***********************
$result = curl_exec($curl);

// ***********************
// 結果
// ***********************
if($result === false) {
	$result = 'Curl error: ' . curl_error($curl);
}
curl_close($curl);
fclose($handle);

print mb_convert_encoding( $result, "CP932", "UTF-8" ) . "\n";

?>

mb_convert_encoding を使用しているのは、WEB が返すキャラクタセットが UTF-8 で、そのままではコマンドプロンプトで表示できないからです。

関連する記事


タグ:Curl PHP
posted by lightbox at 2014-07-30 23:38 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2014年01月14日


PHP の cURL で ftp サーバーにファイルをアップロードする(SSLなし)

PHP のマニュアル通りに考えると、いろいろ変なところもあるのですが、実際これでアップロードできています。SSL 対応すれば、FTPS でも可能だと思います。

URL の指定方法が変わっていて、「ログインディレクトリからの相対位置」と書いてますが、先頭の FTPサーバにログインして自動的にカレントとなる場所からの階層を指定します。実際には、順番にディレクトリ変更して目的の場所に移動して処理しているようです。
<?php
// *********************************************************
// ユーザとパスワード
// *********************************************************
$username = 'userid';
$password = 'password';

// *********************************************************
// 対象ファイル
// ログインディレクトリからの相対位置
// *********************************************************
$url = 'ftpサーバ/path/index.htm';

// *********************************************************
// URL
// *********************************************************
$ftp_server = "ftp://" . $username . ":" . $password . "@" . $url;

// *********************************************************
// 開始
// *********************************************************
$ch = curl_init();

// *********************************************************
// デバッグ用の詳しいメッセージを出力
// *********************************************************
curl_setopt($ch, CURLOPT_VERBOSE, TRUE); 
$fpe = fopen("./debug_ftp.txt","w");
curl_setopt($ch, CURLOPT_STDERR, $fpe);

// *********************************************************
// 転送用のオプション
// *********************************************************
curl_setopt($ch, CURLOPT_URL, $ftp_server);

// *********************************************************
// アップロード用
// *********************************************************
curl_setopt($ch, CURLOPT_PUT, true); 
$putData = fopen("/home/lightbox/www/homepage/dummy/test/links.htm","r");
$sz = filesize("/home/lightbox/www/homepage/dummy/test/links.htm");
print "filesize : $sz<br>";
curl_setopt($ch, CURLOPT_INFILE, $putData); 
curl_setopt($ch, CURLOPT_INFILESIZE, $sz); 

// *********************************************************
// 実行
// *********************************************************
curl_exec($ch);

// *********************************************************
// 終了
// *********************************************************
curl_close($ch);

// *********************************************************
// 後処理
// *********************************************************
fclose($putData);
fclose($fpe);


print "done.<br>\n";
?>




posted by lightbox at 2014-01-14 17:33 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2013年12月05日


任意のサイトのソースコードを表示させる PHP

cURL 関数であらかじめ Content-Type を取得しておいて、表示可能ならば charset を引き継いで、text/plain で表示します。

※ 実際、ブラウザで表示するものとは違う可能性はあります

<?php
$ch = curl_init($_GET['url']);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// *********************************************************
// https 用
// *********************************************************
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);

$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
	echo 'cURL failed';
	exit;
}

$contentType = 'unknown';
if (preg_match('/(Content-Type: .+)/i', $data, $matches1)) {
	$contentType = $matches1[1];
}

$charset = 'utf-8';
if (preg_match('/(charset.+)/i', $data, $matches2)) {
	$charset = $matches2[1];
}

$target = false;
if ( false !== stripos( $contentType, "text" ) ) {
	$target = true;
}
if ( false !== stripos( $contentType, "javascript" ) ) {
	$target = true;
}
if ( false !== stripos( $contentType, "css" ) ) {
	$target = true;
}

if ( !$target ) {
	exit("Can't display");
}

header( "Content-Type: text/plain {$charset}" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

print file_get_contents($_GET['url']);

?>

関連する記事

PHP : WEBでもコマンドラインでもHTTPでファイルをダウンロードする




posted by lightbox at 2013-12-05 18:20 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2013年11月28日


file_get_contents(HTTP ラッパー)を使ったWEBアクセスのhttpヘッダを取得する / $http_response_header という特別な変数

$http_response_header という特別な変数に配列として格納されます。関数内で HTTP ラッパー が使用された場合は、ローカルスコープとなり、$http_response_header は、関数内でのみ有効ですが、global で宣言すると外部からも参照可能になります。
<?php
function get_contents_1() {
	file_get_contents("http://winofsql.jp/toolbox.gif");
	var_dump($http_response_header);
}
get_contents_1();
var_dump($http_response_header);

function get_contents_2() {

	global $http_response_header;

	file_get_contents("http://winofsql.jp/toolbox.gif");
	var_dump($http_response_header);
}

get_contents_2();
var_dump($http_response_header);
?>


以下が実行結果ですが、一回目のセットで、関数外から参照した場合は NULL となっています。

array(9) {
  [0]=>
  string(15) "HTTP/1.1 200 OK"
  [1]=>
  string(35) "Date: Wed, 27 Nov 2013 16:36:58 GMT"
  [2]=>
  string(58) "Server: Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e"
  [3]=>
  string(44) "Last-Modified: Wed, 09 Feb 2011 12:41:58 GMT"
  [4]=>
  string(19) "ETag: "88-4d528b96""
  [5]=>
  string(20) "Accept-Ranges: bytes"
  [6]=>
  string(19) "Content-Length: 136"
  [7]=>
  string(17) "Connection: close"
  [8]=>
  string(23) "Content-Type: image/gif"
}
NULL
array(9) {
  [0]=>
  string(15) "HTTP/1.1 200 OK"
  [1]=>
  string(35) "Date: Wed, 27 Nov 2013 16:36:58 GMT"
  [2]=>
  string(58) "Server: Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e"
  [3]=>
  string(44) "Last-Modified: Wed, 09 Feb 2011 12:41:58 GMT"
  [4]=>
  string(19) "ETag: "88-4d528b96""
  [5]=>
  string(20) "Accept-Ranges: bytes"
  [6]=>
  string(19) "Content-Length: 136"
  [7]=>
  string(17) "Connection: close"
  [8]=>
  string(23) "Content-Type: image/gif"
}
array(9) {
  [0]=>
  string(15) "HTTP/1.1 200 OK"
  [1]=>
  string(35) "Date: Wed, 27 Nov 2013 16:36:58 GMT"
  [2]=>
  string(58) "Server: Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e"
  [3]=>
  string(44) "Last-Modified: Wed, 09 Feb 2011 12:41:58 GMT"
  [4]=>
  string(19) "ETag: "88-4d528b96""
  [5]=>
  string(20) "Accept-Ranges: bytes"
  [6]=>
  string(19) "Content-Length: 136"
  [7]=>
  string(17) "Connection: close"
  [8]=>
  string(23) "Content-Type: image/gif"
}

ただ、この場合取得する事のできる最大値は 1024 のようです。




posted by lightbox at 2013-11-28 01:45 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり