URL上にファイルが存在するかチェックする

どこを参考にしたか忘れました。
単純で簡単そうだったのでこの方法にしました。

<?php
$header = get_headers($url);
if ($header[0] != "HTTP/1.1 404 Not Found") {
 echo "そのファイルは存在します。<br />";
} else {
 echo "そのファイルは存在しません。<br />";
}
?>

WEB上のファイルをダウンロードする

画像をダウンロードするのに必要になりました。
画像以外のダウンロードが出来るか分かりません。
PHP逆引きレシピを主に参考にしてます。

<?php
function downloadWebFile($url, $filename, $dir)
{
 # 保存するファイル名を設定します。
 $fileName = $dir.$filename;

 $fileData = file_get_contents($url);
  
 # ファイルを追記モードで開きます。
 $fp = fopen($fileName, 'ab');

 # ファイルをロックします(排他的ロック)。
 flock($fp, LOCK_EX);

 # ファイルの中身を空にします。
 ftruncate($fp, 0);

 # データを書き込みます。
 fwrite($fp, $fileData);

 # ファイルを閉じます。
 fclose($fp);
}
?>

PHPからFTPアップロードする

2017/06/19追記

touki/ftp - Packagist などライブラリを使ったほうが良いと思います。


ここPHP: ftp_put - Manualといくつか参考にした。

<?php
$ftp = array(
	'ftp_server' => '<FTPサーバー>',
	'ftp_user_name' => '<FTPユーザー名>',
	'ftp_user_pass' => '<FTPパスワード>'
	);
$remote_file = '<アップロード先のパス>';
$file = '<アップロードするローカルファイル>';

function FTPupload($ftp, $remote_file, $file)
{
	// 接続を確立する
	$conn_id = ftp_connect($ftp['ftp_server']);

	// ユーザ名とパスワードでログインする
	$login_result = ftp_login($conn_id, $ftp['ftp_user_name'], $ftp['ftp_user_pass']);

	// ファイルをアップロードする
	if (!ftp_put($conn_id, $remote_file, $file, FTP_BINARY)) {
		echo "There was a problem while uploading $file\n";
		exit;
	}

	// 接続を閉じる
	ftp_close($conn_id);
}
?>

apiを利用してPHPでbit.lyの短縮URLを作る

TwitterBOTをつくるのに必要になりました。
id:riku_kn:20101113:1289660088の内容そのまま拝借しました。
id:riku_knさんお世話になりました。

<?php
function shortenUrl($url)
{
	$username = '<ユーザー名>';
	$apikey = '<APIキー>';
	$bitly_url = "http://api.bit.ly/shorten?version=2.0.1&login=" .$username;
	$bitly_url .= "&apiKey=" .$apikey;
	$bitly_url .= "&longUrl=" .$url;
	$bitly_url .= "&format=xml";
	$XML = file_get_contents($bitly_url);
	$XML = simplexml_load_string($XML);

	return (string)$XML->results->nodeKeyVal->shortUrl;
}
?>

chmodでパーミッション変更できない場合

PHPにももちろんパーミッションを変更する関数はある*1。ところがこれでエラーになる場合がある。

PHPのchmodでエラーになる場合

<?php
// パーミッションを0666へ変更する。
chmod ('hoge/hoge.php', 0666);

// ところが以下のようなエラーになる場合がある。
//Operation not permitted
?>

原因は実行する側の権限の問題。いろいろ調べた結果、systemという関数を使用した*2。スマートではないけどレンタルサーバーでSSHアクセス出来ない場合はこれしか方法がないのかなぁ、という感じ。

対策方法

<?php
// 使用しているサーバーでchmodコマンドが使えることが前提
system('chmod 666 ./hoge/hoge.php');exit;
?>

備考

相変わらずスマートさにかける・・・。

*1:[http://php.net/manual/ja/function.chmod.php:title=PHP Manual : chmod]

*2:[http://php.net/manual/ja/function.chmod.php:title=PHP Manual : system]

PHPで文字化けにハマる

細かくチェックすることって大事だなぁ、と言う話。

仕事でヤフーオークションのデータをスクレーピングすることになったのだが、EUC-JPからUTF-8に変換するのに機種依存文字が文字化けしてこまった。ググッた結果eucwin-jpで処理すればいいらしい。とかあったのだがダメだった。結局、内部エンコーディング確認したり、mb_detect_encoding()の変換結果を確認しながらパズルのように試してたら、出来た。みたいな腑に落ちない結果です。

環境

結果

コード

<?php
// ページのエンコードはUTF-8
header("Content-Type: text/html; charset=UTF-8");

// 対象となる文字列(すでに文字化けしてますが・・)
$str = '&#58084;&#58088;∩*m左は機種依存文字記号です。';
echo '<p>'.$str.'<br>';
echo 'エンコーディングは'.mb_detect_encoding($str).'です</p>';

// 'EUC-JP'から'UTF-8'へ変換
$str_euc = mb_convert_encoding($str, 'SJIS-win', 'EUC-JP' );
echo '<p>'.$str_euc.'<br>';
echo 'エンコーディングは'.mb_detect_encoding($str_euc).'です</p>';

// 'EUC-JP'から'UTF-8'へ変換
$str_euc = mb_convert_encoding($str_euc, 'UTF-8', 'SJIS-win' );
echo '<p>'.$str_euc.'<br>';
echo 'エンコーディングは'.mb_detect_encoding($str_euc).'です</p>';
$encoding = mb_internal_encoding();

// 内部エンコーディングを確認してみた
echo '<p>内部エンコーディングは'.$encoding.'です。</p>';
?>

結果

∩*m左は機種依存文字記号です。
エンコーディングはUTF-8です

<文字化けしてます>
エンコーディングはSJISです

∩*m左は機種依存文字記号です。
エンコーディングはUTF-8です

内部エンコーディングはEUC-JPです。

備考

  • いや、全く理由がわからん。SJIS-wineucwin-jpにしてもダメだった。誰か理由を教えてください。