Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как добавить в начало файла данные не удаляя ничего?
 
 автор: PyccHeBa   (02.11.2007 в 03:56)   письмо автору
 
 

$file = fopen( 'filename.txt', 'r+');
fputs($file, "something");


Вот пробовала так, но новые данные стрирают начало файла

Как добавить в начало файла, не стирая ничего из файла?

   
 
 автор: EXP   (02.11.2007 в 04:56)   письмо автору
 
   для: PyccHeBa   (02.11.2007 в 03:56)
 

так
<?php
$content 
file_get_contents("filename.txt"); // считывание

$file fopen'filename.txt''w');
fputs($file,  "something\n" $content );
fclose($file);
?>

или так
<?php
$array 
file("filename.txt"); // считывание
array_unshift($array"something\n"); // добавление в начало массива

$file fopen'filename.txt''w');
fputs($fileimplode($array));
fclose($file);
?>

ещё есть file_put_contents( string filename, mixed data [, int flags [, resource context]] )
но тоже не может просто добавить в начало файла

   
 
 автор: PyccHeBa   (02.11.2007 в 05:13)   письмо автору
 
   для: EXP   (02.11.2007 в 04:56)
 

Работает! Но, только если файл не слишком большой.

Проблема вот в чем - файл это таблица - результат slq запроса SELECT INTO OUTFILE

Он должен содержать 100 000 строк.
Оба метода работают только до 65 000 строк.

Есть ли еще какие либо варианты?

   
 
 автор: Unkind   (02.11.2007 в 08:53)   письмо автору
 
   для: PyccHeBa   (02.11.2007 в 05:13)
 

Чтобы дописать что-то в начало, надо перемещать текущее содержимое. Так что лучше обойтись без этого.

   
 
 автор: provodnik   (02.11.2007 в 11:29)   письмо автору
 
   для: Unkind   (02.11.2007 в 08:53)
 

Может это пойдет:
auto_prepend_file
Определение файла, который будет выводится в начале каждого php-скрипта. Путь указывается от корня файловой системы сервера. С помощью этой директивы можно, например, подключить ко всем php-файлам скрипт подключения к базе данных, вынеся его за пределы пространства, доступного через браузер. Это позволит немного повысить защиту сайта от взлома.
Область применения: httpd.conf, .htaccess
Пример: php_value auto_prepend_file /www/server/prepend.php

auto_append_file
Определение файла, который будет выводится в конце каждого php-скрипта.
Область применения: httpd.conf, .htaccess
Пример: php_value auto_append_file /www/server/append.php

Источник: http://www.softtime.ru/article/index.php?id_article=97

   
 
 автор: EXP   (02.11.2007 в 17:46)   письмо автору
 
   для: PyccHeBa   (02.11.2007 в 03:56)
 

можно попробовать его перезаписывать так

<?php
$string 
"<?php\necho \$data = 'somedata\n' ;
?>\n" 
;

$file_res1 fopen('new_filename.txt''w');
        
fwrite($file_res1$string) ;

$file_res2 fopen('filename.txt''r');

while(
$string fread($file_res210000)) // дозапись по 10000 байт например
    
{
        
fwrite($file_res1$string) ;
    }
fclose($file_res2);
fclose($file_res1);

unlink'filename.txt' ) ; // удаление
rename'new_filename.txt''filename.txt' ); // переименование

?>
но если одновременно кто-то имеет доступ к этим файлам надо ещё использовать flock()

   
 
 автор: PyccHeBa   (02.11.2007 в 23:44)   письмо автору
 
   для: EXP   (02.11.2007 в 17:46)
 

Кажется самое лучшее что я могла бы сделать это объединить два файла. Есть ли команда php для этого?

   
 
 автор: bronenos   (03.11.2007 в 00:05)   письмо автору
 
   для: PyccHeBa   (02.11.2007 в 23:44)
 

Чтение 1
Чтение 2
Запись 1+2

   
 
 автор: PyccHeBa   (03.11.2007 в 03:00)   письмо автору
 
   для: bronenos   (03.11.2007 в 00:05)
 

Да, но если я присвою строковой переменной fread, то нельзя слишком большой файл, как я понимаю. Можно ли объединить файлы командой linux вызванной из php например, cat file1 file2 > file3

   
 
 автор: EXP   (03.11.2007 в 03:31)   письмо автору
 
   для: PyccHeBa   (03.11.2007 в 03:00)
 

>объединить файлы командой linux вызванной из php например, cat file1 file2 > file3
наверное можно, незнаю правильно-ли так, на виндовзе не работает )
<?php
system
("cat file1 > file3");
system("cat file2 >> file3");
?>

   
 
 автор: Shiva   (03.11.2007 в 04:08)   письмо автору
 
   для: PyccHeBa   (03.11.2007 в 03:00)
 

Вообще, предыдущий пример EXP с чтением и записью в цикле должен работать при любом размере файла. Так как в памяти в каждый отдельный момент времени только небольшая часть.

   
 
 автор: EXP   (03.11.2007 в 03:06)   письмо автору
 
   для: bronenos   (03.11.2007 в 00:05)
 

можно ещё, если первый файл ненужен после этого, просто открыть его для дозаписи
fopen('file1.txt', 'a'); и в цикле считать и добавить второй

   
 
 автор: PyccHeBa   (03.11.2007 в 04:06)   письмо автору
 
   для: EXP   (03.11.2007 в 03:06)
 

А цикл не займет много времени? PHP работает медленно, а файл содержит 100 000 строк почти 6 мгб

   
 
 автор: PyccHeBa   (03.11.2007 в 04:57)   письмо автору
 
   для: PyccHeBa   (03.11.2007 в 04:06)
 

хотелось бы сделать очень просто - взять объединить 2 файла по принципу cat file1 file2 > file3
Как это сделать? Вышепредложенный метод не сработал. У меня Win, на сервере Linux

   
 
 автор: EXP   (03.11.2007 в 05:13)   письмо автору
 
   для: PyccHeBa   (03.11.2007 в 04:57)
 


<?php 
list($headtime$time) = explode(chr(32), microtime());
$headtime = ($time $headtime);  # время начала работы

$file_res1 fopen('test.txt''w');  
flock($file_res12); 

$file_res2 fopen('index.php''r');  // ~40k
 
flock($file_res21); 
        
fwrite($file_res1fread($file_res2filesize'index.php' ))) ;
 
flock($file_res23); 
 
fclose($file_res2); 
 
$file_res2 fopen('php_manual_ru.html''r'); // ~16mb
 
flock($file_res21); 
  
while(
$string fread($file_res210000)) // дозапись по 10000 байт например 
    

        
fwrite($file_res1$string) ; 
    } 
flock($file_res13); 
flock($file_res23); 
fclose($file_res1); 
fclose($file_res2); 

// unlink( 'filename.txt' ) ; // удаление 
// rename( 'new_filename.txt', 'filename.txt' ); // переименование 

list($msec,$sec) = explode(chr(32), microtime()); 
echo  
'<hr />[_' round(($sec $msec) - $headtime4) . 's_]';
?>

[_0.157s_]
<?php 

list($headtime$time) = explode(chr(32), microtime());
$headtime = ($time $headtime);  # время начала работы

$test = `copy /Y /A "D:\\WebServers\\home\\test2.ru\\www\\LIB\\index.php" + /A "D:\\WebServers\\home\\test2.ru\\www\LIB\\php_manual_ru.html" /A "D:\\WebServers\\home\\test2.ru\\www\\LIB\\test.txt"` ;
echo 
$test ;

list(
$msec,$sec) = explode(chr(32), microtime()); 
echo  
'<hr />[_' round(($sec $msec) - $headtime4) . 's_]';

?>

[_0.3517s_]

никак не куплю себе ещё оперативной памяти (:

   
 
 автор: PyccHeBa   (06.11.2007 в 02:11)   письмо автору
 
   для: EXP   (03.11.2007 в 05:13)
 

Спасибо, но что то сложное получается ((

Нет ли какой нибудь команды в PHP чтобы назначить команду LINUX cat file1 file2 > file3

   
 
 автор: Unreal   (06.11.2007 в 15:51)   письмо автору
 
   для: PyccHeBa   (06.11.2007 в 02:11)
 

<?php exec('cat file1 file2 > file3'?>

   
 
 автор: Саня   (06.11.2007 в 16:09)   письмо автору
 
   для: PyccHeBa   (06.11.2007 в 02:11)
 

<?
$fp 
fopen("data.txt""r");
$new fopen("new.txt""w");

fwrite($new"некоторые данные в начале файла\r\n");

while ( !
feof($fp) )
  
fwrite($newfread($fp1024));

~0.1 секунды

Порядок этого числа уменьшается при увеличении второго параметра функции fread().

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования