/**
* 中にファイルやディレクトリが入っているディレクトリごと削除する
* @param string $dir 削除するディレクトリ
* @param boolean $is_delete_myself 指定したディレクトリ自身を削除するか
* @return string 削除したファイルやリストの結果
*/
function remove_directory( $dir, $is_delete_myself=false )
{
$result_message = "";
if ( ! is_dir($dir) ){
return "ディレクトリ ({$dir}) は存在しません\n";
}
else{
$dir = preg_replace("{/$}","",$dir);
}
if ($handle = opendir("$dir")) {
while (false !== ($item = readdir($handle))) {
if ($item != "." && $item != "..") {
if (is_dir("$dir/$item")) {
$r = remove_directory("$dir/$item", true);
$result_message .= $r;
} else {
unlink("$dir/$item");
$result_message .= " remove [fie] $dir/$item\n";
}
}
}
closedir($handle);
if ( $is_delete_myself == true ){
rmdir($dir);
$result_message .= " remove [directory] $dir\n";
}
}
return $result_message;
}
削除を実行する(指定したディレクトリ自身も削除する)
$r = remove_directory("./my_dir/", true);
echo $r;
結果例
remove [fie] ./my_dir/b00009vxzx_1.jpg
remove [fie] ./my_dir/b01lxs5b8x_1.jpg
remove [fie] ./my_dir/b01lxs5b8x_2.jpg
remove [fie] ./my_dir/b01lxs5b8x_3.jpg
remove [directory] ./my_dir
引用元 : https://goo.gl/Z7MFkC
PHPでFTPファイルアップロード / ダウンロード を行うには PHPのFTP関数 http://php.net/ftp を使用する方法がありますが、
https://packagist.org/packages/league/flysystem
を使用するほうが早く、FTPをはじめとする次の転送方式にも同じインターフェイスで対応できます(要 追加インストール)
composer からインストールします
composer require league/flysystem
autoload.php を読みこませればOK
autoloadを使いたくない場合は次のように spl_autoload_register() に無名関数を登録してオートロードを作成します。
spl_autoload_register(function($class) {
$prefix = 'League\\Flysystem\\';
if ( ! substr($class, 0, 17) === $prefix) {
return;
}
$class = substr($class, strlen($prefix));
$location = __DIR__ . 'path/to/flysystem/src/' . str_replace('\\', '/', $class) . '.php';
if (is_file($location)) {
require_once($location);
}
});
(ローカル)
use League\Flysystem\Filesystem;
use League\Flysystem\Adapter\Local as Adapter;
$filesystem = new Filesystem(new Adapter('/path/to/directory'));
(FTP)
use League\Flysystem\Adapter\Sftp as Adapter;
$filesystem = new Filesystem(new Adapter(array(
'host' => 'example.com',
'port' => 21,
'username' => 'username',
'password' => 'password',
'privateKey' => 'path/to/or/contents/of/privatekey',
'root' => '/path/to/root',
'timeout' => 10,
)));
// ファイルの存在確認
$exists = $filesystem->has('path/to/file.txt');
// ファイルを読み込む
$contents = $filesystem->read('path/to/file.txt');
// ファイルを読み込むストリームを得る
$stream = $filesystem->readStream('something/is/here.ext');
// ファイルに書き込む
$filesystem->write('path/to/file.txt', 'contents');
// ファイルに追記する
$filesystem->put('path/to/file.txt', 'contents');
// ファイルを削除する
$filesystem->delete('path/to/file.txt');
// ファイルを読み込んで削除する
$contents = $filesystem->readAndDelete('path/to/file.txt');
// ファイルをリネーム(移動)する
$filesystem->rename('filename.txt', 'newname.txt');
Fatal error: Call to undefined function League\Flysystem\Adapter\ftp_connect() in vendor/league/flysystem/src/Adapter/Ftp.php on line 98
この場合はPHPのftp関数が使用できないサーバですので使用できません。 ソケット通信を使用したFTPクラスを使用するといいでしょう
$file = new SplFileObject(__DIR__ . '/input.html', 'r');
$file->setFlags(SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);
foreach ($file as $n => $line) {
if ($line === false) {
continue;
}
echo "$n $line", PHP_EOL;
}
$filename = 'input.txt';
$fp = fopen($filename,'r') or die("ファイル({$filename})のオープンに失敗しました");
while ( ($line = fgets($fp,99999)) !== false ) { // 1行あたり最大99999bytes
print "$line\n";
}
fclose($fp);
$filename = 'output.txt';
$data = 'テストデータです';
$tmp_filename = getmypid().'.tmp';
$fp = fopen($tmp_filename, 'w');
fwrite($fp, $data);
fclose( $fp );
@mkdir(dirname($filename), 0755, true); // ディレクトリ がなければ自動で作成
rename($tmp_filename, $filename);
Twigに自作フィルタを追加するにはフィルタを定義して addFilter するだけでOKです。
$filter = new Twig_SimpleFilter('file_exists', function ($filename) {
// ディレクトリは適宜書き換えること
return file_exists(dirname(__FILE__)."/{$filename}");
});
$twig->addFilter($filter);
使い方(HTML内で以下のように記述)
{% if "test.jpg"|file_exists %}
ファイルが存在します
{% else %}
ファイルは存在しません
{% endif %}
PHPでファイルをダウンロードさせるにはブラウザにダウンロードファイルを知らせるためのヘッダとファイル名を送ります
header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=test.csv"); print 'ファイル内容';
PHPでファイルロック(排他制御)をするのは標準の flock 関数が簡単で有効です。
しかし flock関数はサーバーによっては正常動作しない(排他制御が出来ない、またはロックしたままプロセスが死
ぬとロック解除が出来ない)ことがまれにあります。(サーバーによります。)
ですのでPHPスクリプトをアップロードする先のサーバーが flock が正常に動作するか毎回確認しないといけませ
ん。
また flock関数ではロックのトライ時間(タイムアウト時間)を自由に設定することができません。
そこで Perlメモ( http://is.gd/cKqS11 )の有名なファイルリネーム方式のファイルロックを採用します。
すでにPHPに移植されている方がいるのでそこから引用( http://is.gd/rj4aOc )
https://pgmemo.tokyo/data/filedir/834_3.zip
require_once('exfilelock.php');
$exfl = new exfilelock();
$exfl->flock() or die('ERROR : LOCK ERROR');
// ここに排他制御して実行したい何かしらの処理を記述
$exfl->unflock() or die('ERROR : UNLOCK ERROR');
**ファイルロックのテストスクリプト
test_filelock.php:ロックを使ったカウンターアップのテスト
ファイルを解凍してできるディレクトリ「data」「lockdir」のパーミッションを777にして abで同時に100並列実行します。 カウンターが正常に10000までいけばOK。
ab -n 100 -c 100 http://mitoite.net/test/php_mailform/php_mailform.php?cmd=append_imap
画像ファイルの width, height を取得して挿入するSmarty Plugin
<?php function smarty_modifier_image_wh($file_name='') { if (! $file_name ) { return "error:{$file_name}"; } if (!is_file($file_name)) { return "error:{$file_name}"; } list($width, $height, $type, $attr) = getimagesize($file_name); if ($width && $height){ return 'width="' .$width. '" height="'.$height.'"'; } else{ return "error: can not get width height:{$file_name}"; } }
<img src="{$image_file}" {$image_file|image_wh} />{/if}
とすると width="100" height="200" といった情報が入ります。
{$image_file|image_wh} ↓ {"`$data_dir`/`$image_file`"|image_wh}
とします。
PHPでURLからローカルにファイルをダウンロードするには以下のようにします。
function file_download($url, $dir='.', $save_base_name='' ){ if ( ! is_dir($dir) ){ die("ディレクトリ({$dir})が存在しません。");} $dir = preg_replace("{/$}","",$dir); $p = pathinfo($url); $local_filename = ''; if ( $save_base_name ){ $local_filename = "{$dir}/{$save_base_name}.{$p['extension']}"; } else{ $local_filename = "{$dir}/{$p['filename']}.{$p['extension']}"; } if ( is_file( $local_filename ) ){ print "すでにファイル({$local_filename})が存在します<br>\n";} $tmp = file_get_contents($url); if (! $tmp){ die("URL({$url})からダウンロードできませんでした。");} $fp = fopen($local_filename, 'w'); fwrite($fp, $tmp); fclose($fp); }
実行は
// ■1. ファイル名「hogehoge.jpg」でディレクトリ「images」に保存する場合 file_download('http://www.xxx.xxx.jp/hogehoge.jpg', 'images'); // ■2. ファイル名「0001.jpg」でディレクトリ「images」に保存する場合 file_download('http://www.xxx.xxx.jp/hogehoge.jpg', 'images', '0001');
UNIX系OSでファイルの処理を行うときに必ず気を付けないといけないのがumask。
これはファイル処理を行うときのパーミッション(権限)を指定しておくものです。
printf ("%03o",umask());
結果
022
と帰ってくることが多いと思います。
この状態で新規ファイルを作成するとパーミッションは【644】となります。
新規に作成するファイルのパーミッションを【666】にしたければ
あらかじめ
umask(0000);
としておけばいいでしょう。
Smartyキャッシュを削除するには clear_cache(); を使用します。
void clear_cache(string template, string cache_id, string compile_id, int expire_time);
Smartyを使用したサイトではSmartyキャッシュを使用することにより劇的に高速化されますが、(テストページや一時的に表示したページの)キャッシュファイルをクリアし忘れると、逆にハードディスクに負荷をかけて動作を遅くするおそれがあります。
古い不要キャッシュの削除は必ず行いましょう。
// 7日以上古いキャッシュを削除する $days = 7; $time = $days * 24 * 60 * 60; // 10回に1回実行 if( rand(1,10)==1 ){ $smarty->clear_all_cache($time); }
ファイルを使用せずキャッシュにMySQLを使用する
http://www.smarty.net/docsv2/ja/section.template.cache.handler.func.tpl
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$ext = pathinfo($filename, PATHINFO_DIRNAME);
$filename_only = pathinfo($original_file_name, PATHINFO_FILENAME);
です。
PHPのファイルアップロードのファイル要領制限を変更するには次の3つのパラメーターを調整する必要があります。 (必ずしも3つの値を揃える必要はありません)
upload_max_filesize = 256M
post_max_size = 256M
memory_limit = 256M
upload_max_filesize = 256M
post_max_size = 256M
memory_limit = 256M
# ファイルアップロードの最大サイズを 10Mに設定
php_value upload_max_filesize 10M
php_value post_max_size 10M
# ファイルアップロードの最大サイズを 500Kに設定
php_value upload_max_filesize 500K
php_value post_max_size 500K
// ファイルアップロードの最大サイズを 10M に設定
ini_set('upload_max_filesize', 10 * 1024 * 1024);
print "upload_max_filesize: " . ini_get('upload_max_filesize')." Bytes です。";
とします。
ZIPファイルを扱う pecl拡張をインストールする。
root になって
yum install php-devel yum install zlib-devel pecl install zip
でインストール完了。
完了すると
You should add "extension=zip.so" to php.ini
と表示されるので
/etc/php.ini に【extension=zip.so】を追加。
apacheの再起動をします
apachectl graceful
確認は phpinfo() で出来ます。
pecl拡張がインストールできない環境の場合
http://phpspot.org/blog/archives/2007/10/phpzip.html
■ phpmyadmin(GPLライセンス)のライブラリを使用する
http://winofsql.jp/VA003334/phpVarious060803234456.htm
PHPであるディレクトリ(フォルダ)内のファイルを全て削除するには
function delete_allfile($dirpath=''){ if ( strcmp($dirpath,'')==0 ){ die('delete_allfile : error : please set dir_name'); } $deleted_list = array(); $dir = dir($dirpath); while ( ($file=$dir->read()) !== FALSE ){ if (preg_match('/^\./',$file)){ continue; } // skip dir , skip hidden file else { array_push($deleted_list, $file); if ( ! unlink("$dirpath/$file") ){ die("delete_allfile : error : can not delete file [{$dirpath}/{$file}]"); } } } return $deleted_list; }
$deleted_list = delete_allfile(ディレクトリ名);
で実行
意外と何度も調べてしまうのでメモ
echo pathinfo('./aaa/bbb/ccc/ddd.jpg', PATHINFO_EXTENSION);
結果
jpg
echo pathinfo('./aaa/bbb/ccc/ddd.jpg', PATHINFO_DIRNAME);
結果
./aaa/bbb/ccc
echo pathinfo('./aaa/bbb/ccc/ddd.jpg', PATHINFO_BASENAME);
結果
ddd.jpg
echo pathinfo('./aaa/bbb/ccc/ddd.jpg', PATHINFO_FILENAME);
結果
ddd
$p = pathinfo('./aaa/bbb/ccc/ddd.jpg');
print_r($p);
// 実行結果
Array
(
[dirname] => ./aaa/bbb/ccc
[basename] => ddd.jpg
[extension] => jpg
[filename] => ddd
)
ただし、拡張子がないときは $p['extension'] がセットされて帰ってこないので注意。
basename ("ファイル名","サフィックス");
とします。
$test=basename ( "hogehoge.jpg",".jpg" );
関数を定義するのがいいでしょう(か?)
function _delete_extention( $string='' ){
$p = pathinfo($string);
return basename ( $string, ".{$p['extension']}" );
}
サイズの大きな画像やCSVを加工中にメモリエラー PHP Fatal error: Allowed memory size of 8388608 bytes exhausted が発生することがあります。
このエラーはメモリ不足なので、PHPの最大使用メモリを増やしてあげると回避できます。 下記の例では200MBytesに設定しています。
/etc/php.ini の設定を以下のように変える
memory_limit = 500M ; Maximum amount of memory a script may consume (8MB)
ギガバイト表記も使えます (4ギガにしたい場合)
memory_limit = 4G ; Maximum amount of memory a script may consume (8MB)
PHPプログラム内に下記コードを記述する
ini_set('memory_limit', '200M');
rename( $from, $to ) or die("can not move:{$from}:{$to}");
または次のように関数を作ってもいいですか少々遅いと思います。
function move( $from, $to ){
if ( copy ($from, $to) ){
unlink($from);
return true;
} else{
return false;
}
}