powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / информировать пользователя о начале экспорта данных в PHP
40 сообщений из 40, показаны все 2 страниц
информировать пользователя о начале экспорта данных в PHP
    #37755660
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Нужн предоставить приложению экспортировать данные бд в файл, количество данных из бд может быть довольно значительным, например, десятки и сотни мегабайт. Пока данные все данные не получены из бд, страница висит, что может смущать пользователя и браузер не выдает окно сохранения файла. Я видел системы, которые очень быстро начинали выдавать данные клиенту. Можно ли как-нибудь улучшить код для индикации начала экспорта.
Код примерно такой:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
       $this->getResponse()->setHeader('Content-Type', 'text/csv; charset=utf-8')
                            ->setHeader('Content-Disposition', 'attachment; filename="'. $fileName . '"');      

        $contacts = new Contact();
       $fp = fopen('php://output', 'w');        
       foreach ($mongodbCursor as $subscriber) {
           $row = formRow($subscriber);
       fputcsv($fp, $row);
       }      




Спасибо за информацию.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37755664
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005,

я так понимаю вы говарите о функции flush() ?
имхо данные таких размеров надо зиповать перед выдачей юзеру.
и у меня такое ощющение что еще тормазит ваша ООП оболочка под базу.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37755675
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, я не говорил о функции flush.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37755682
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РенатOLEG_2005,

я так понимаю вы говарите о функции flush() ?
имхо данные таких размеров надо зиповать перед выдачей юзеру.
и у меня такое ощющение что еще тормазит ваша ООП оболочка под базу.

Могли бы вы скачать, что вы имели в виду о функции flush?
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37755710
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005,

у вас идет генерация файла больших размеров. Вы хотите чтобы файл отправлялся сразу не ожидая окончания генерации. Правильно я вас понял? Ну используйте эту функцию для того что отправить все что в кеше - браузеру пользователя.
Если не парвильно то скажите что хотите
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37755723
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я хочц чтобы файл отправлялся сразу не ожидая окончания генерации.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37755728
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я хочу, чтобы файл отправлялся сразу, не ожидая окончания генерации.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37755861
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто интересно, что получит в итоге клиент, если он будет принимать файл быстрее, чем этот файл формируется скриптом? Размер файла заранее неизвестен, если правильно понимаю.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37755879
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, размер файла сейчас не передается клиенту.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37756641
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Данные код не работает. Данные всё равно отправляеются только после получения всех данных.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    ini_set('output_buffering', 0);
    ini_set('zlib.output_compression', 0);
    $this->getResponse()->setHeader('Content-Type', 'text/csv; charset=utf-8')
                            ->setHeader('Content-Disposition', 'attachment; filename="'. $fileName . '"');      

	ob_flush();
	flush();

        $contacts = new Contact();
       $fp = fopen('php://output', 'w');        
       foreach ($mongodbCursor as $subscriber) {
           $row = formRow($subscriber);
       fputcsv($fp, $row);
       }      
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37756742
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005,

я всегда удмал это надо в цикле делать...
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37756760
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот довольно простой пример. Данные выводятся, только когда цикл закончил работу.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
		ini_set('output_buffering', 0);
		ini_set('zlib.output_compression', 0);	
		

		ob_start();

		$buffer = str_repeat(" ", 4096);
		$buffer .= "\r\n<span></span>\r\n";

		for ($i=0; $i<5; $i++) {
  			echo $buffer.$i;
  			ob_flush();
  			flush();
  			sleep(1);
		}
		ob_end_flush();		
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37756769
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, в данном случае buffer даже лишнее, но тоже не работает:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
		ini_set('output_buffering', 0);
		ini_set('zlib.output_compression', 0);	
		

		ob_start();

		for ($i=0; $i<5; $i++) {
  			echo $i;
  			ob_flush();
  			flush();
  			sleep(1);
		}
		ob_end_flush();		
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37756822
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используется php 5.3 и apache.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37756836
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005Данные всё равно отправляеются только после получения всех данных.В некоторых случаях такое поведение имеет место быть. Конфигурацию вебсервера опишите подробно.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37756848
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
allow_call_time_pass_reference	Off	Off
allow_url_fopen	On	On
allow_url_include	Off	Off
always_populate_raw_post_data	Off	Off
arg_separator.input	&	&
arg_separator.output	&	&
asp_tags	Off	Off
auto_append_file	no value	no value
auto_globals_jit	On	On
auto_prepend_file	no value	no value
browscap	no value	no value
default_charset	UTF-8	no value
default_mimetype	text/html	text/html
define_syslog_variables	Off	Off
disable_classes	no value	no value
disable_functions	no value	no value
display_errors	Off	Off
display_startup_errors	Off	Off
doc_root	no value	no value
docref_ext	no value	no value
docref_root	no value	no value
enable_dl	Off	Off
error_append_string	no value	no value
error_log	no value	no value
error_prepend_string	no value	no value
error_reporting	22527	22527
exit_on_timeout	Off	Off
expose_php	On	On
extension_dir	/usr/lib/php5/20090626	/usr/lib/php5/20090626
file_uploads	On	On
highlight.bg	#FFFFFF	#FFFFFF
highlight.comment	#FF8000	#FF8000
highlight.default	#0000BB	#0000BB
highlight.html	#000000	#000000
highlight.keyword	#007700	#007700
highlight.string	#DD0000	#DD0000
html_errors	Off	Off
ignore_repeated_errors	Off	Off
ignore_repeated_source	Off	Off
ignore_user_abort	Off	Off
implicit_flush	Off	Off
include_path	.:/usr/share/php:/usr/share/pear	.:/usr/share/php:/usr/share/pear
log_errors	On	On
log_errors_max_len	1024	1024
magic_quotes_gpc	Off	Off
magic_quotes_runtime	Off	Off
magic_quotes_sybase	Off	Off
mail.add_x_header	On	On
mail.force_extra_parameters	no value	no value
mail.log	no value	no value
max_execution_time	30	30
max_file_uploads	20	20
max_input_nesting_level	64	64
max_input_time	60	60
max_input_vars	1000	1000
memory_limit	256M	256M
open_basedir	no value	no value
output_buffering	4096	4096
output_handler	no value	no value
post_max_size	64M	64M
precision	14	14
realpath_cache_size	16K	16K
realpath_cache_ttl	120	120
register_argc_argv	Off	Off
register_globals	Off	Off
register_long_arrays	Off	Off
report_memleaks	On	On
report_zend_debug	On	On
request_order	GP	GP
safe_mode	Off	Off
safe_mode_exec_dir	no value	no value
safe_mode_gid	Off	Off
safe_mode_include_dir	no value	no value
sendmail_from	no value	no value
sendmail_path	/usr/sbin/sendmail -t -i 	/usr/sbin/sendmail -t -i 
serialize_precision	100	100
short_open_tag	On	On
SMTP	localhost	localhost
smtp_port	25	25
sql.safe_mode	Off	Off
track_errors	Off	Off
unserialize_callback_func	no value	no value
upload_max_filesize	16M	16M
upload_tmp_dir	no value	no value
user_dir	no value	no value
user_ini.cache_ttl	300	300
user_ini.filename	.user.ini	.user.ini
variables_order	GPCS	GPCS
xmlrpc_error_number	0	0
xmlrpc_errors	Off	Off
y2k_compliance	On	On
zend.enable_gc	On
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37756862
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В коде я задаю параметры:
Код: php
1.
2.
ini_set('output_buffering', 0);
ini_set('zlib.output_compression', 0);	



Не совсем понятно, в чем могут быть проблемы.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37757004
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PHP как установлен - модуль, cgi, fastcgi, другой способ? С модулем должно работать. Апач сам отдает контент или за фронтендом прячется?
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37757078
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PHP установлен на модуль. Используется только Apache.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37757170
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005В коде я задаю параметры:
Код: php
1.
2.
ini_set('output_buffering', 0);
ini_set('zlib.output_compression', 0);	



Не совсем понятно, в чем могут быть проблемы.
вы точно понимаете что делаете?
выставляете output_buffering в ноль а ниже пытаетесь управлять буферизацией)
почитайте мануал.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37757182
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что здесь не так?
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37757191
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь я отключаю буферизцию и сжатие, полагаю, что вторая инструкция лишняя, так как это значение по умлочанию.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37757347
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005А что здесь не так?
почитайте - будет полезно
http://www.php.su/functions/?cat=outcontrol
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37757407
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РенатOLEG_2005А что здесь не так?
почитайте - будет полезно
http://www.php.su/functions/?cat=outcontrol

Похоже данные у меня установлены также:
utput_buffering "0"
output_handler no value
implicit_flush "0"

Пока непонятно, в чем проблема.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37757674
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
OLEG_2005, вы тут привели не весь код, и скорее всего долгое выполнение у вас до этого цикла.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37757738
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?,
Проблема сейчас даже с этим кодом. Вывод осуществляется, после окончания цикла.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	ini_set('output_buffering', 0);
		ini_set('zlib.output_compression', 0);	
		

		ob_start();

		for ($i=0; $i<5; $i++) {
  			echo $i;
  			ob_flush();
  			flush();
  			sleep(1);
		}
		ob_end_flush();		
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37757744
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыла уточнить, что это код вызвается в котроллере Zend Framework. Мне кажется, что проблема в этом.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37757756
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вынес в отдельный скрипт код, весь код:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?php
ini_set('output_buffering', 0);
ini_set('zlib.output_compression', 0);	
		
ob_start();
for ($i=0; $i<5; $i++) {
	echo $i . '<br/>';;
  	ob_flush();
  	flush();
  	sleep(1);
	}
ob_end_flush();		
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37757839
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005,

а попробуйте сделать:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?php
ini_set('output_buffering', false);  
ini_set('zlib.output_compression', false);
for ($i=0; $i<100; $i++) {
    for ($j = 1; $j < 100 ; $j++) print $j."\n";
    print '<br/>';
    flush();
    usleep(1000000*0.1);
}
die();


и потом скажите, почему же ваш "не работает" а данный скрипт работает
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37757878
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон забыл на написать данный скрипт работает в отдельном скрипте, но не работает в контроллере Zend Framework.
<?php
ini_set('output_buffering', 0);
ini_set('zlib.output_compression', 0);

ob_start();
for ($i=0; $i<5; $i++) {
echo $i . '<br/>';;
ob_flush();
flush();
sleep(1);
}
ob_end_flush();
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37757881
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, что ввел в заблуждение, ранее в сообщении о том, что я вынес в отдельны скрип код из контроллера, я забыл написать, что он работает.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37758007
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РенатOLEG_2005,

а попробуйте сделать:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?php
ini_set('output_buffering', false);  
ini_set('zlib.output_compression', false);
for ($i=0; $i<100; $i++) {
    for ($j = 1; $j < 100 ; $j++) print $j."\n";
    print '<br/>';
    flush();
    usleep(1000000*0.1);
}
die();


и потом скажите, почему же ваш "не работает" а данный скрипт работает

Скажите, пожалуйста, ваш код работает, если в php.ini output_buffer = 4096?
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37758018
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, данный код работает только, если в php.ini output_buffer = 0. ini_set('output_buffering', 0) почему-то не переопределяет данный параметр, например, если задать его в php.ini 4096 код перестает работать, а get_ini('output_buffering') возвращает 4096, после ini_set('output_buffering', 0);
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?php 
ini_set('output_buffering', 0);
ini_set('zlib.output_compression', 0);	
		
ob_start();
for ($i=0; $i<5; $i++) {
	echo $i . '<br/>';;
  	ob_flush();
  	flush();
  	sleep(1);
	}
ob_end_flush();	
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37758398
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по этой ссылке http://php.net/manual/en/configuration.changes.modes.php нельзя переопределить output_buffering с помощью ini_set. Пока непонятно, почему код не работате, если в php.ini output_buffering = 4096, но работает, если output_buffering = 0 и что можно сделать, чтобы код работал, когда output_buffering = 4096.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
ini_set('output_buffering', 0);
echo ini_get('output_buffering');
exit();
ini_set('zlib.output_compression', 0);	
		
ob_start();
for ($i=0; $i<5; $i++) {
	echo $i . '<br/>';
  	ob_flush();
  	flush();
  	sleep(1);
	}
ob_end_flush();		
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37758432
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы код работал при output_buffering = 4096 в php.ini заменил:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
ob_start();
for ($i=0; $i<5; $i++) {

	echo $i, '<br/>';
  	ob_flush();
  	flush();
  	sleep(1);
	}
ob_end_flush();		



На код:


Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
ob_start();
for ($i=0; $i<5; $i++) {

	echo str_pad('', 4096), $i, '<br/>';
  	ob_flush();
  	flush();
  	sleep(1);
	}
ob_end_flush();		



Может быть у кого-нибудь есть идея лучше?
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37758458
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуть лучше наверное, так:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
ob_start();
for ($i=0; $i<5; $i++) {

	echo str_pad('', ini_get('output_buffering')), $i, '<br/>';
  	ob_flush();
  	flush();
  	sleep(1);
	}
ob_end_flush();		



Все равно, по-моему, не очень красиво.
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37759549
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для того, чтобы работало в контроллере Zend Framework, можно добвить в Bootstrap.php, что-то вроде этого:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
	protected function _initFront()
	/**
	 * hint to the dispatcher that it should not use output buffering to capture output generated by action controllers.
	 *  By default, the dispatcher captures any output and appends it to the response object body content. 
	 */
	{
		$frontController = Zend_Controller_Front::getInstance();
		$frontController->setParam('disableOutputBuffering', 1);		
	}
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37760460
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005Чуть лучше наверное, так:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
ob_start();
for ($i=0; $i<5; $i++) {

	echo str_pad('', ini_get('output_buffering')), $i, '<br/>';
  	ob_flush();
  	flush();
  	sleep(1);
	}
ob_end_flush();		



Все равно, по-моему, не очень красиво.
Интересно, а как обычно решают эту задачу. Есть ли вариан лучше? Может быть кто-нибудь сталкивался с подобными проблемами?
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37760533
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OLEG_2005,

что значит - получше?
...
Рейтинг: 0 / 0
информировать пользователя о начале экспорта данных в PHP
    #37760598
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется добавление str_pad('', ini_get('output_buffering')) не очень красивым и интуитивно понятным решением.
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / информировать пользователя о начале экспорта данных в PHP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]