2014-01-10 2 views
1

Я пытаюсь получить экспорт в CSV-скрипт для загрузки на сервер при запуске в качестве cronjob, но также по-прежнему работает через сеть.Формирование сгенерированного CSV для загрузки при запуске cron на сервере

Когда я запускаю сценарий из Интернета, он заставляет CSV загружать, что здорово, однако, когда я запускаю его на сервере (CentOS Server), он просто перефразирует содержимое файла.

Мне нужно его загрузить файл в область, определенную в cronjob.

//OK lets export 
include("config.php"); 
$table = "data"; 
$filename = "Export_" . date("Y-m-d_H-i"); 

header("Content-type: text/csv; charset=UTF-8"); 
header("Content-Disposition: attachment; filename=" . $filename . ".csv"); 

// create a file pointer connected to the output stream 
$output = fopen('php://output', 'w'); 

// output the column headings 
fputcsv($output, array('artist', 'title', 'presenter', 'timeplayed')); 

// fetch the data 
mysql_connect($dbhost,$dbuser,$dbpass); 
mysql_select_db('prs'); 
$rows = mysql_query('SELECT * FROM '.$table.' WHERE timeplayed >= NOW() - INTERVAL 24  HOUR ORDER BY id DESC'); 
if($rows === FALSE) 
{ 
    die(mysql_error()); 
} 

// loop over the rows, outputting them 
while ($row = mysql_fetch_assoc($rows)) fputcsv($output, $row); 

Любой, у кого есть другие идеи?

+0

Почему вы не используете ['SELECT ... INTO OUTFILE'] (http://dev.mysql.com/doc/en/select-into.html)? – eggyal

+0

Использование 'headers()' довольно бессмысленно в cron-скрипте - потому что нет никакого браузера для загрузки: это то, что приходит с вырезанием и вставкой какого-либо кода elses, не пытаясь понять, что он на самом деле делает .... почему не писать в фактическое имя файла файловой системы, а не 'php: // output'? Вы даже определяете имя файла ('$ filename =" Export_ ". Date (" Y-m-d_H-i ");'), не используя его –

ответ

1

См manual

php://output is a write-only stream that allows you to write to the output buffer mechanism 
      in the same way as print and echo. 

Это действительно говорит все это.

Поэтому, когда вы запускаете это из браузера, стандартный выходной механизм равен send it to the browser, так как это будет echo или print. Но в режиме CLI в PHP он отправляет вывод на терминал.

Ответ изменить эту строку из

$output = fopen('php://output', 'w'); 

в

$output = fopen($filename, 'w'); 

Вы тогда просто должны решить, если вы работаете через браузер или (хрон) CLI и here is a suggestion

if (php_sapi_name() !== 'cli') { 
    header("Content-type: text/csv; charset=UTF-8"); 
    header("Content-Disposition: attachment; filename=" . $filename . ".csv"); 
    readfile($filename); 
} 

Вам нужно будет проверить, что сообщает ваша система с помощью php_sapi_name(), чтобы убедиться, что вы тестируете подходящее состояние.

+0

Спасибо за ответ! Я попытался использовать $ output = fopen ($ filename, 'w'); Но что происходит, так это получение разрешенных прав, я предполагал, потому что он не может найти файл, потому что он еще не создан? То же самое при чтении файла Ему удается запустить в терминале, но выход файла пуст :-( –

+0

Это звучит как проблема с разрешением. Убедитесь, что пользователь, выполняющий cron, и пользователь, который запускает Apache, разрешен для создания файлы в этой папке! – RiggsFolly

+0

Оказывается, это было потому, что я не определил ее, чтобы перейти к определенной папке с правами! Derp! Изменил ее так, чтобы она попала в нужную папку, и теперь она правильно написана! ! Спасибо за помощь! –

Смежные вопросы