laravel5: chdir(): No such file or directory (errno 2)
I have a problem when deploy website build on laravel 5 into VPS server, but on local machine it work fine.
My page is http://easyway.vn/ current page display blank with error
Failed to load resource: the server responded with a status of 500 (Internal Server Error)
When I run
php artisan serve --host=0.0.0.0
I have a error
[ErrorException]
chdir(): No such file or directory (errno 2)
Server Info
OS: Linux 2.6
Server version: Apache/2.2.29 (Unix)
PHP 5.4.41 (cli) (built: Jun 4 2015 13:27:02) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
Help me please!
it means that your Laravel Application Can't Find the public folder.
I got it to work by
changing :
chdir($this->laravel->publicPath());
in :
vendor/laravel/framework/src/Illuminate/Foundation/Console/ServeCommand.php
To :
chdir('/');
Renaming public folder name causes this issue.
Touching files under vendor directory is something you may never do.
Here is a working alternative way which I have tested and using in my active project.
Create app/Console/Commands/Serve.php files and set the content to this:
<?php
namespace App\Console\Commands;
use Exception;
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Process\PhpExecutableFinder;
use Symfony\Component\Process\ProcessUtils;
class Serve extends Command {
/**
* The console command name.
*
* @var string
*/
protected $name = 'serve';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Serve the application on the PHP development server';
/**
* Execute the console command.
*
* @return void
*
* @throws \Exception
*/
public function fire() {
chdir('/');
$host = $this->input->getOption('host');
$port = $this->input->getOption('port');
$base = ProcessUtils::escapeArgument($this->laravel->basePath());
$binary = ProcessUtils::escapeArgument((new PhpExecutableFinder)->find(false));
$this->info("Laravel development server started on http://{$host}:{$port}/");
if (defined('HHVM_VERSION')) {
if (version_compare(HHVM_VERSION, '3.8.0') >= 0) {
passthru("{$binary} -m server -v Server.Type=proxygen -v Server.SourceRoot={$base}/ -v Server.IP={$host} -v Server.Port={$port} -v Server.DefaultDocument=server.php -v Server.ErrorDocument404=server.php");
} else {
throw new Exception("HHVM's built-in server requires HHVM >= 3.8.0.");
}
} else {
passthru("{$binary} -S {$host}:{$port} {$base}/server.php");
}
}
/**
* Get the console command options.
*
* @return array
*/
protected function getOptions() {
return [
['host', null, InputOption::VALUE_OPTIONAL, 'The host address to serve the application on.', 'localhost'],
['port', null, InputOption::VALUE_OPTIONAL, 'The port to serve the application on.', 8000],
];
}
}
Update the app/Console/Kernel.php file with this content:
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel {
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
// Commands\Inspire::class,
Commands\Serve::class,
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule) {
// $schedule->command('inspire')
// ->hourly();
}
}
That's all!
Now run your serve command:
$ php artisan serve
Server started:
Laravel development server started on http://localhost:8000/
I know you asked this question a long time ago but for those who seek the easiest and efficient way to solve this problem:
This error means laravel can't find the public folder.You must add this piece of code in the register method of Providers/AppServiceProvider.php:
public function register()
{
$this->app->bind('path.public', function() {
return base_path('PATH TO PUBLIC FOLDER');
});
}
Example with public_html
In your case,, the path for public HTML will be:
public function register()
{
$this->app->bind('path.public', function() {
return base_path('public_html');
});
}
This way Laravel knows where to look to find the public folder path.
- Step one In vendor/laravel/framework/src/Illuminate/Foundation/Console/ServeCommand.php
`chdir($this->laravel->publicPath());`
change to
chdir('/');
2.Step two Change these two paths in your_public_folder/index.php
require __DIR__.'/../your_app/bootstrap/autoload.php';
$app = require_once __DIR__.'/../your_app/bootstrap/app.php';
3.Step three Change public path in your_app/server.php
if ($uri !== '/' && file_exists(__DIR__.'/../public_html/'.$uri)) {
return false;
}
require_once __DIR__.'/../public_html/index.php';
Note: Change these path according to your App's new folder structure.
Change
chdir(public_path());
To
chdir('/');
From : vendor/laravel/framework/src/Illuminate/Foundation/Console/ServeCommand.php