19

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!

Terry To
  • 191
  • 1
  • 1
  • 5
  • 2
    check that your folder 'public' exists and all the assets are inlcuded in it. and check the index.php file (also included in public directory) has the right path for the autoload.php and app.php – myh34d May 25 '16 at 12:17

13 Answers13

46

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('/');
Mostafa Norzade
  • 1,578
  • 5
  • 24
  • 40
sam ben
  • 946
  • 9
  • 18
16

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/
Oniya Daniel
  • 359
  • 6
  • 15
Sinan Eldem
  • 5,564
  • 3
  • 36
  • 37
  • 2
    If you are using Laravel 5.4, change the `fire()` method in the `app/Console/Commands/Serve.php` file to `handle()`. – Oniya Daniel Jul 06 '18 at 06:47
  • 4
    And please, can somebody explain why this problem even occurred in the first place. I absolutely remember doing nothing wrong. This raises serious concerns on **stability** – Oniya Daniel Jul 06 '18 at 06:51
9

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.

Salar Bahador
  • 1,433
  • 1
  • 14
  • 26
5

Change

chdir(public_path());

To

chdir('/');

From : vendor/laravel/framework/src/Illuminate/Foundation/Console/ServeCommand.php

Hasib Kamal Chowdhury
  • 2,476
  • 26
  • 28
  • 1
    You must never edit the vendor. This is the last thing that you want to do. When a new package is installed or updated the vendor will be changed. – Salar Bahador Nov 22 '21 at 08:13
4
  1. 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.

Karan Datwani
  • 532
  • 6
  • 6
4

just create an folder named public in you root directory. If you downloaded projects from GitHub or existing old projects.

Ronny Dsouza
  • 358
  • 2
  • 12
3

this error appears when you rename the public folder.

Never edit files in vendor folder. After composer update or fresh install you will lose your changes.

A better solution is to edit bootstrap/app.php and place this snippet before the return statement.

$app->bind('path.public', function() {
    return base_path() . '/web';
});
1

go to server.php in root folder and rename any public to any name you have

amir
  • 11
  • 1
1

Usually when this type of error occurs it means Laravel is Looking for a public folder and it cannot be found. This depends on how you have configured your application and using php artisan serve --host=0.0.0.0 will not work in this case. The best way to handle this is to place you application in your server(htdocs) and access it in your url.

The vendor directory contains your Composer dependencies. Visit Laravel Documentation for details. Never edit anything in vendor because it may cause problem when you do composer update.

J. Chomel
  • 8,193
  • 15
  • 41
  • 69
Kiarie Henry
  • 110
  • 1
  • 7
  • 1
    This was very useful information to me. I had a missing public folder. Fixed by regenerating public files using `npm run dev` (laravel 5.4). – ippi Oct 16 '17 at 18:18
0

remember when you run in production the path of public change to public_html so to run again in localhost I changed into app/Providers/AppServiceProvider.php

this:

public function register()
    {
       $this->app->bind('path.public',function(){return'/public';});
    }

to this:

public function register()
    {
       // commented this line
    }

Also after changed .env enviroment and in server.php and index.php

0

be sure if "public" folder exist or no

  • 1
    Although this could be the correct answer to the question, it helps when you explain why and how your answer solves the problem. – Eduard Keilholz Nov 15 '21 at 14:47
0

You might have overwritten the public_path method, maybe in AppServiceProvider or index.php.

Zain Ali
  • 40
  • 3
0

Never edit files in vendor folder. A simple solution is just create an folder named "public" in you root directory and copy into this folder an "index" of a project that works.

INDEX

<?php

/**
 * Laravel - A PHP Framework For Web Artisans
 *
 * @package  Laravel
 * @author   Taylor Otwell <taylor@laravel.com>
 */

define('LARAVEL_START', microtime(true));

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader for
| our application. We just need to utilize it! We'll simply require it
| into the script here so that we don't have to worry about manual
| loading any of our classes later on. It feels great to relax.
|
*/

require __DIR__.'/../vendor/autoload.php';

/*
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let us turn on the lights.
| This bootstraps the framework and gets it ready for use, then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight our users.
|
*/

$app = require_once __DIR__.'/../bootstrap/app.php';

/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client's browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);