スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Web] Internet Explorer 8 でやたら重い or 開けないページがあるでござる

こちらの環境(Firefox 3 / Google Chrome / IE7 )で普通に見えるページが、
とある環境からは開けないとのことで、いろいろ確認してみるとIE8ではアクセスしても
なかなかレスポンスが返らず、結局タイムアウトになったりするという事象。

どうも、

Internet Explorer 8 を使用すると、表示、アクセス、または読み込みができない Web ページがある
http://support.microsoft.com/kb/967897/ja

こういうことらしく、

方法 6: 互換性の表示
以前のバージョンのブラウザーでは表示できる Web サイトが、Internet Explorer 8 では正しく読み込まれない場合は、Web サイトを互換モードで表示できます。Web サイトを正常に読み込むことができない場合、Internet Explorer 8 は自動的にサイトを互換モードで表示するかどうかを確認します。また、Web サイトを互換モードで表示するように Internet Explorer を手動で構成することもできます。これを行うには、以下の手順を実行します。

1. 1 つの Internet Explorer ウィンドウを除いてすべて閉じます。
2. [ツール] をクリックし、[互換表示] をクリックします。
3. [互換表示] が使用できない場合は、[互換表示設定] をクリックします。
4. [追加する Web サイト] で、アクセスする Web サイトを入力し、[追加] をクリックします。
5. [閉じる] をクリックします。
6. Internet Explorer を再起動します。
7. Web サイトを表示してみてください。



これを試してみたら表示できたり。

で、PHPからテンプレートとしてHTMLをinclude して表示しているようなページだったのですが、
テンプレート自体はHTMLとしてアクセスできる。PHPを介するとだめで、いろいろ試すと
ヘッダの出し方を変えてみたら互換表示でなくても表示できたというしだい。

どうもIE8には癖があるので、ヘッダの出力とかちゃんとしてやらんと
表示してくれんよ、という話らしいです。
そんな話はちらほら聞いてたけど、実際にぶつかったのはこれが初めてだわ。

参考:
Internet Explorer 8正式版レビュー - @IT
http://www.atmarkit.co.jp/fdotnet/special/ie8review/ie8review_01.html

IE8のドキュメントメモ - ヲゾゾ wozozo ウンコプログラマー ~綺麗なお姉さん~
http://blog.wozozo.jp/archives/263
スポンサーサイト

テーマ : web制作
ジャンル : コンピュータ

[PHP] ローカルファイルを別のサーバにFTP通信してコピーしたい

ロードバランサ使ってるサーバで、アップロードされたファイルを
他のサーバにも同じファイルを設置しなければならないときとか。

当然ながら他のサーバに copy() が使えるわけもないので、FTP通信をして
ファイルを送り込むこととします。

ただFTP関数についてはデフォルトでは入ってないようなので、
レンタルサーバなら使うのをあきらめないといけないかも。
そもそもレンタルサーバを使ってる時点でそういうニーズはないかと思いますが。

PHP: FTP関数 インストール手順
http://www.php.net/manual/ja/ftp.installation.php

PHP で FTP 関数を使用するには、PHP をインストールする際に --enable-ftp オプションを追加する必要があります。

Windows 版の PHP にはこの拡張モジュールのサポートが組み込まれています。これらの関数を使用するために拡張モジュールを追加でロードする必要はありません。



FTP関数使わないでどうしても他のサーバに送り込みたいときは、
試してないけどスクリプトの中でPOST送信して、受け側のサーバに
それ受けとって処理するスクリプトを置いておけばいけそうな気もする。

とりえあずFTP送信するのはこんな感じで。

function putFileFtp( $f, $f_to, $host, $port, $timeout, $id, $pass ){

//戻り値
$ret = 0;
// 接続を確立
$conn = ftp_connect( $host, $port, $timeout );
// ログインする
$login_result = ftp_login( $conn, $id, $pass );
// ファイルをアップロードする
if (ftp_put( $conn, $f_to, $f, FTP_BINARY )) {
echo "アップロード成功 ".$f." to ".$f_to."\n";
$ret = 1;
} else {
echo "アップロード中にエラー ".$f."\n";
$ret = -1;
}
// 接続を閉じる
ftp_close( $conn );
return( $ret );
}
//---------------------------------
// 上記関数を使った処理
//---------------------------------
$f = "./test.jpg";
//試しに時間を入れている。パスはFTPログインしたときに見える形で
$f_to = "/public_html/ftp_test/test".date( "His" ).".jpg";
//送信したいサーバのIP(ダミー)
$ftp_host = "999.999.999.999";
//ポート
$ftp_port = 21;
//タイムアウトの時間
$ftp_timeout = 20;
//FTPログインID
$ftp_id = "xxxxxxx";
//FTPログインパスワード
$ftp_pass = "pppppppppp";

$ret = putFileFtp( $f, $f_to, $ftp_host, $ftp_port, $ftp_timeout, $ftp_id, $ftp_pass );
if( $ret > 0 ){
print "FTP OK";
}else{
print "FTP NG";
}
?>


それぞれの関数の使い方はマニュアルを参照ください。

PHP: 一覧 - FTP 関数
http://php.plus-server.net/ref.ftp.html

テーマ : PHP
ジャンル : コンピュータ

[PHP] ファイルをPHPスクリプトを介してダウンロードさせたい

たいして技術的に面倒なことではないものの、ちょいちょい使われるものなのでメモ。

function putFile( $f ){
$len = filesize( $f );
header( 'Content-Disposition: attachment; filename='.$f );
header( 'Content-Length:'.$len );
header( 'Content-Type: application/octet-stream' );
readfile( $f );
}
$f = isset( $_GET['f'] ) ? $_GET['f'] : "";
putFile( $f );


ヘッダ「Content-Disposition」を利用します。

HTTP 非標準ヘッダ - Content-Disposition
http://studyinghttp.net/header#Content-Disposition

使うシーンとしては、ログインが必要な会員サイトとかにあるファイルを
直アクセスされたくはないんだけれど、ダウンロードさせたいなという時に。
ファイルの本体を http でアクセスできない場所に置くとか、ダミーのBASIC認証の
かかった場所に置くとか、.htaccess でアクセス制御するとかして、
そのファイルを読みだして出力することでダウンロードさせるわけです。

上記の書き方だとこのスクリプトと同じディレクトリのものしかダウンロード
できないので、実用では関数にパスを渡して、関数内ではパスからファイル名を
切り出す、といった処理を追加する必要があるかと思います。
(Content-Disposition: で filename= を指定する必要があるため)

たいていの環境ではこれでダイアログが出て何かのアプリで開くか保存するか
という選択になるはずですが、あくまでブラウザの挙動なので必ずそうなるかは
わかりません。実際に利用している方がこれでうまくいかないということで
あれば、何か運用で逃げるかする必要はあるでしょう。

テーマ : PHP
ジャンル : コンピュータ

[PHP] 外部メール送信のために Qdsmtp を使ったのだけど Cc: 送信ができなかった件

メールフォームなどよく作っているのですが、
たいていのものは設置したサーバの送信機能を使うんですね。
レンタルサーバなんかじゃ、ほぼそうです。

ただ自社でサーバを持っている場合、そちらを使いたいということがあって、
Webサーバにメールを送る機能がついてないときがあると。
そういう場合に、外部のサーバを使うことになります。

ガリガリ書いてやるとか、PEAR使うとかいろいろ手段はあるとは思うのですが、
労力は省きたいし、それだけのためにPEARを入れるのも面倒だし、
そもそもお客様にPEAR入れてというのも言いにくい話。

そこで1ファイルをインクルードするだけで使えるこいつの出番。

Qdsmtp-Simple SMTP Mailer for PHP - Qdsmtpとは
http://hal456.net/qdsmtp/

使い方も簡単。パラメータとか与えたのち、 mail() と同じようにして使います。

require_once('qdsmtp.php');

$param = array(
'host'=>'smtp.example.com',
'port'=> 25 ,
'from'=>'from@example.com',
'protocol'=>'SMTP',
);
$smtp = & new QdSmtp($param);


こう準備をしてやってから、

$to = 'address@example.com';
$subject = 'Hello!'
$body = 'I am Spok from Valcum ..........Live log and Prosper.';

$smtp ->mail( $to , $subject , $body );


mail() と同じように使ってやる。
ヘッダが必要なら第四引数に書く。これも mail() と同じ。

で、自サーバで送信するときは mail() を使い、外部サーバを利用するときには
これを利用して、同じようにパラメータを投げる……としていたのですが、
どうも Cc: がうまく送信できない。ヘッダに書きこまれているし、メーラでも
Cc: には表示されている。でも Cc: に指定されたアドレスにはメールが届いてない。

まったく意味がわからないながらも解決したのはこんな手順。

1)ヘッダは From: Reply-To: Cc: を指定できるようにしていた
2)これらは前から順に文字列に連結してつくっていき、Cc は指定があれば末尾につく
3)いろいろ試すと、Cc が末尾になると実際の送信はされてない模様
4)Cc: を末尾から移動し、末尾には人畜無害なヘッダ情報を付与した

$addHeader = "From: ".$mail."\r\n";
$addHeader .= "Reply-To: ".$mail_from."\r\n";
//設定されていれば
if( strlen( $mailCc) > 0 ){
$addHeader .= "Cc: ".$mailCc."\r\n";
}
//CCを末尾にするとなぜか送信されないので、冗長な情報を付与する
$addHeader .= "Content-Transfer-Encoding: 7bit\r\n";
$addHeader .= "\r\n";


まったく理解してやってるわけではないのですが、
とりあえず Cc: に送信されない件についてはこれで解決。
RFC とこのライブラリのソースを見れば解かるのでしょうけど。

テーマ : PHP
ジャンル : コンピュータ

[PHP] 一定文字数で強制的に改行を挿入したい

というオーダがあったので。
作ってみたけど非常にまわりくどいので正攻法なのかどうか。
オーダとしては、とある文字列の
「1行が半角76文字を超えたらそこで強制的に改行を入れてほしい」
というもの。聞く限りはシンプルな話です。

でも結構めんどくさい手法で実現しました。
最初はこれを実現するために近い関数あるだろう、ということで
str_split() を見つけ、これを使おうとしました。

str_split - 文字列を配列に変換する
http://phpspot.net/php/man/php/function.str-split.html

上記の場合でいうと、76文字で文字列を分割してやって、分割したそれぞれを改行を
はさんで結合してやれば改行が挿入されますよね。

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAA + "\n" + AAAAAAAAAAAAAAAAAAAAA + "\n" + AAAA

とはいえ、扱うのは日本語なので、それを考慮する必要があります。
でもマルチバイト関数に mb_str_split() が……。ないじゃん!
そんなに難しくないだろうから自作するか……と思い、でもどっかに
似たのがあるだろう、と探して流用をしてみる。


//===============================================
// str_split MB版 ( 文字列, エンコード, 分割最大長(デフォルト:1) )
//===============================================
function mb_str_split( $str, $enc, $length = 1 ) {

//空であれば偽を返す
if ( $length <= 0 ) return FALSE;

//配列の初期化
$result = array();

for ( $i = 0, $idx = 0; $i < mb_strlen( $str, $enc ); $i += $length ) {
$result[$idx++] = mb_substr( $str, $i, $length, $enc );
}
//結果を戻す
return $result;
}


で、作ってみてテストする前に気付いたのですが、先のオーダは「半角76文字」
これだと確かに文字数でカウントできるものの、どんな文字でも1文字換算されて
しまいます。
なら strlen() でバイト数を測ればいいのかというと、strlen() は文字コードで
全角文字を3バイトで判断するなどするので、あんまり私は信用しておりません。

日本語文字列のバイト数取得にstrlenだけではダメな理由 -PHP
http://www.cpa-lab.com/tech/0144

というわけで方針を変えて、
「頭から一文字ずつ拾ってバイト数(半角1全角2のみなしバイト)をカウントし、
 一定文字数を超えるようであればそこで改行を挟み込む」
ことにしました。
バイト数(半角1全角2のみなしバイト)の測定は半角→全角の変換を行い、それが
変換前と一致するか否かで判断しました。

//===============================================
// 文字列が半角か全角であるかを判別する
// (正確には半角が混在しているか)
//===============================================
function checkHankaku( $str, $enc ){
if( strlen( $str ) <= 0 ){
return( FALSE );
}
//全角変換をして異なっているかを確認する
if( $str != mb_convert_kana($str, "AKS", $enc ) ){
//異なっているので半角が混在する
return( TRUE );
}else{
//すべて全角である
return( FALSE );
}
}


1文字ずつこの関数にかければその文字が半角か全角かわかるはず。

で、通しての処理としては

//===============================================
// 一定文字数で改行を挿入する
//===============================================
function insertLfCode( $str, $n, $enc ){
//空であれば空を返す
if( strlen( $str ) <= 0 ){
return( "" );
}
//初期化
$str_join = "";
$str_char = "";
$cnt = 0;
//一文字ずつ処理
for( $i = 0; $i < mb_strlen( $str, $enc ); $i++ ){
$str_char = mb_substr( $str, $i, 1, $enc );
//セットする文字が半角か全角であるか判別しカウント
$cnt += checkHankaku( $str_char, $enc ) ? 1 : 2;
//カウント数が規定文字数以上になっていれば
if( $cnt >= $n ){
$cnt = 0;
$str_join .= "\n";
}
//一文字ずつ末尾にセット
$str_join .= $str_char;
}
return( $str_join );
}


をベースの処理(1行の文字列に一定数で改行を挿入)として、

//==========================================================
// 一定文字以上改行がなければ強制的に改行を挿入する
//==========================================================
function insLF( $str, $n, $enc ){
//------------------------
//初期化
//------------------------
$str_join = "";
$str_ret = "";

// まず改行を統一
$str = str_replace( "\r\n", "\n", $str );
$str = str_replace( "\r", "\n", $str );

// 次に改行で配列に分割
$buf_txt = explode( "\n", $str );
// それぞれ分割されたものをさらに一定文字に分割し、改行で連結することで改行を挿入
for( $i = 0; $i < count( $buf_txt ); $i++ ){
$str_line = $buf_txt[$i];
$str_line = str_replace( "\r", "", $str_line );
$str_line = str_replace( "\n", "", $str_line );
//一定文字以上で改行がなければ
if( getDummyByteSize( $str_line, $enc ) > $n ){
$str_line = insertLfCode( $str_line, $n, $enc );
}
//連結を行う
$str_join .= $str_line;
//もともと改行で分割されていたため、改行をつけなおす
$str_join .= "\n";
}
//連結で生成した文字列を戻す(いちおうトリミングを行う)
$str_ret = trim( $str_join );

return( $str_ret );
}


getDummyByteSize() についてはここではソースはあげていませんが、
前述の checkHankaku() を一文字ずつかけて、文字列についてみなしのバイト数を
算出するものを作成しました。

元の改行交じりの文字列をいったん一行ずつに分割し、件の改行挿入処理を
各行に行い、再度連結するということをやってます。

非常にめんどくさいことをやっております!
なんかもっとシンプルにできたような気もしますが……。

テーマ : PHP
ジャンル : コンピュータ

検索フォーム
リンク
最新記事
最新コメント
カテゴリ
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。