Laravel - другой путь при запуске функции от Chrome и как запланированный вызов - PullRequest
1 голос
/ 09 февраля 2020

Извините, если это любительский вопрос, но я не смог найти ответ. У меня есть функция, где я загружаю отчет из Менеджера объявлений. Это прекрасно работает, когда я вхожу в программу, а затем запускаю функцию непосредственно из Chrome. У меня есть Laravel 5.2.45 и Php 7.0.13

Код:

private function parseDailyReportFile($suborderid)
{       
    $fileName = Str::random();
    $filePathGz = 'uploads/admanagerriport/' . $fileName . '.csv.gz';
    $filePathCsv = 'uploads/admanagerriport/' . $fileName . '.csv';
    $filePathXlsx = 'uploads/admanagerriport/' . $fileName . '.xlsx';

    // Download the report.
    $this->reportDownloader->downloadReport(ExportFormat::CSV_DUMP, $filePathGz);

    //Convert (extract) csv from csv.gz
    $buffer_size = 4096; // read 4kb at a time
    $input_file = gzopen($filePathGz, 'rb');
    $output_file = fopen($filePathCsv, 'wb');

    while (!gzeof($input_file)) {
        fwrite($output_file, gzread($input_file, $buffer_size));
    }

    fclose($output_file);
    gzclose($input_file);

    $output_file = fopen($filePathCsv, 'r');
    $index = 0;
    $suborderstat = SubOrderStats::where('suborder_id', $suborderid)->first();
    $suborder = SubOrder::where('id', $suborderid)->first();
    if (empty($suborderstat)) {
        $suborderstat = new SubOrderStats();
        $suborderstat->suborder_id = $suborderid;
        $suborderstat->subcampaign_end = $suborder->subcampaign_end;
    }
    fgetcsv($output_file, 10000, ",");
    while (($data = fgetcsv($output_file, 1000, ',')) !== FALSE) {          
        foreach($data as $key => $value) {
            if ($key == 2) {
                $suborderstat->av = $value;
            } elseif ($key == 3) {
                $suborderstat->ct = $value;
            } elseif ($key == 4) {
                $suborderstat->vi = $value;
            }
        }
    }
    fclose($output_file);
    unlink($filePathGz);
    $suborderstat->save();
}

Однако я хотел бы запланировать эту функцию и запланировал ее в Kernel. php , но если он запускается из ядра. php Я получил эту ошибку, что файл не существует. Если я добавлю 'public /' перед загрузкой. Он прекрасно работает из ядра. php, но не из Chrome. В файловой системе. php У меня есть путь публикации по умолчанию c: public / 100.

Спасибо за помощь.

Журнал ошибок:

[2020-02-09 20:01:06] local.ERROR: RuntimeException: Directory uploads/admanagerriport does not exist for sink value of uploads/admanagerriport/WcNeJ6msN9N9Q4sd.csv.gz in F:\xampp_php70\htdocs\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php:356
Stack trace:
#0 F:\xampp_php70\htdocs\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php(44): GuzzleHttp\Handler\CurlFactory->applyHandlerOptions(Object(GuzzleHttp\Handler\EasyHandle), Array)
#1 F:\xampp_php70\htdocs\vendor\guzzlehttp\guzzle\src\Handler\CurlHandler.php(39): GuzzleHttp\Handler\CurlFactory->create(Object(GuzzleHttp\Psr7\Request), Array)
#2 F:\xampp_php70\htdocs\vendor\guzzlehttp\guzzle\src\Handler\Proxy.php(28): GuzzleHttp\Handler\CurlHandler->__invoke(Object(GuzzleHttp\Psr7\Request), Array)
#3 F:\xampp_php70\htdocs\vendor\guzzlehttp\guzzle\src\Handler\Proxy.php(51): GuzzleHttp\Handler\Proxy::GuzzleHttp\Handler\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#4 F:\xampp_php70\htdocs\vendor\guzzlehttp\guzzle\src\PrepareBodyMiddleware.php(42): GuzzleHttp\Handler\Proxy::GuzzleHttp\Handler\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#5 F:\xampp_php70\htdocs\vendor\guzzlehttp\guzzle\src\Middleware.php(30): GuzzleHttp\PrepareBodyMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array)
#6 F:\xampp_php70\htdocs\vendor\guzzlehttp\guzzle\src\RedirectMiddleware.php(68): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#7 F:\xampp_php70\htdocs\vendor\guzzlehttp\guzzle\src\Middleware.php(59): GuzzleHttp\RedirectMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array)
#8 F:\xampp_php70\htdocs\vendor\googleads\googleads-php-lib\src\Google\AdsApi\Common\GuzzleLogMessageHandler.php(44): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#9 F:\xampp_php70\htdocs\vendor\guzzlehttp\guzzle\src\HandlerStack.php(67): Google\AdsApi\Common\GuzzleLogMessageHandler::Google\AdsApi\Common\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#10 F:\xampp_php70\htdocs\vendor\guzzlehttp\guzzle\src\Client.php(275): GuzzleHttp\HandlerStack->__invoke(Object(GuzzleHttp\Psr7\Request), Array)
#11 F:\xampp_php70\htdocs\vendor\guzzlehttp\guzzle\src\Client.php(123): GuzzleHttp\Client->transfer(Object(GuzzleHttp\Psr7\Request), Array)
#12 F:\xampp_php70\htdocs\vendor\guzzlehttp\guzzle\src\Client.php(129): GuzzleHttp\Client->requestAsync('GET', Object(GuzzleHttp\Psr7\Uri), Array)
#13 F:\xampp_php70\htdocs\vendor\googleads\googleads-php-lib\src\Google\AdsApi\AdManager\Util\v201911\ReportDownloader.php(151): GuzzleHttp\Client->request('GET', 'https://storage...', Array)
#14 F:\xampp_php70\htdocs\app\Http\Controllers\Admin\AdManagerController.php(600): Google\AdsApi\AdManager\Util\v201911\ReportDownloader->downloadReport('CSV_DUMP', 'uploads/admanag...')
#15 F:\xampp_php70\htdocs\app\Http\Controllers\Admin\AdManagerController.php(429): App\Http\Controllers\Admin\AdManagerController->parseDailyReportFile(14542)
#16 F:\xampp_php70\htdocs\app\Http\Controllers\Admin\AdManagerController.php(92): App\Http\Controllers\Admin\AdManagerController->buildReportQueryToAdManagerTableDaily(14542, '2019-04-01')
#17 [internal function]: App\Http\Controllers\Admin\AdManagerController->dailyRun()
#18 F:\xampp_php70\htdocs\vendor\laravel\framework\src\Illuminate\Container\Container.php(507): call_user_func_array(Array, Array)
#19 F:\xampp_php70\htdocs\vendor\laravel\framework\src\Illuminate\Container\Container.php(602): Illuminate\Container\Container->call(Array, Array)
#20 F:\xampp_php70\htdocs\vendor\laravel\framework\src\Illuminate\Container\Container.php(502): Illuminate\Container\Container->callClass('App\\Http\\Contro...', Array, NULL)
#21 F:\xampp_php70\htdocs\vendor\laravel\framework\src\Illuminate\Console\Scheduling\CallbackEvent.php(61): Illuminate\Container\Container->call('App\\Http\\Contro...', Array)
#22 F:\xampp_php70\htdocs\vendor\laravel\framework\src\Illuminate\Console\Scheduling\ScheduleRunCommand.php(61): Illuminate\Console\Scheduling\CallbackEvent->run(Object(Illuminate\Foundation\Application))
#23 [internal function]: Illuminate\Console\Scheduling\ScheduleRunCommand->fire()
#24 F:\xampp_php70\htdocs\vendor\laravel\framework\src\Illuminate\Container\Container.php(507): call_user_func_array(Array, Array)
#25 F:\xampp_php70\htdocs\vendor\laravel\framework\src\Illuminate\Console\Command.php(169): Illuminate\Container\Container->call(Array)
#26 F:\xampp_php70\htdocs\vendor\symfony\console\Command\Command.php(256): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#27 F:\xampp_php70\htdocs\vendor\laravel\framework\src\Illuminate\Console\Command.php(155): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#28 F:\xampp_php70\htdocs\vendor\symfony\console\Application.php(794): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#29 F:\xampp_php70\htdocs\vendor\symfony\console\Application.php(186): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Console\Scheduling\ScheduleRunCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#30 F:\xampp_php70\htdocs\vendor\symfony\console\Application.php(117): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#31 F:\xampp_php70\htdocs\vendor\laravel\framework\src\Illuminate\Foundation\Console\Kernel.php(107): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#32 F:\xampp_php70\htdocs\artisan(35): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#33 {main}  

1 Ответ

0 голосов
/ 09 февраля 2020

Если вы намереваетесь запустить этот код как из браузера, так и в виде запланированной задачи, вам необходимо добавить некоторые логи c, чтобы определить, выполняется ли код сначала в консоли. Например:

// is this running as a scheduled task?
if (app()->runningInConsole()) {
    $filePathGz = public_path('uploads/admanagerriport/') . $fileName . '.csv.gz';
} else {
    $filePathGz = 'uploads/admanagerriport/' . $fileName . '.csv.gz';
}

Это должно помочь вам начать работу в правильном направлении.

...