Skip to content

Latest commit

 

History

History
155 lines (122 loc) · 6.01 KB

KnownIssues.md

File metadata and controls

155 lines (122 loc) · 6.01 KB

Known issues

Class swoole does not exist

  • In LaravelS, Swoole is Http Server started in cli mode, replacing FPM.
  • Delivering a task, triggering an asynchronous event will call app('swoole') and get the Swoole\http\server instance from the Laravel container. This instance is injected into the container only when LaravelS is started.
  • So, once you leave the LaravelS, due to the cross-process, you will be unable to successfully call app('swoole'):
    • The code that runs in various command line modes, such as the Artisan command line and the PHP script command line.
    • Run the code under FPM/Apache PHP Module.

Use package jenssegers/agent

Listen System Event

// Reset Agent
\Event::listen('laravels.received_request', function (\Illuminate\Http\Request $req, $app) {
    $app->agent->setHttpHeaders($req->server->all());
    $app->agent->setUserAgent();
});

Not support cli mode officially, you need to remove the logic of runningInConsole, but there may be some other issues.

// Search runningInConsole(), then annotate it
$this->enabled = $configEnabled /*&& !$this->app->runningInConsole()*/ && !$this->app->environment('testing');

Use package overtrue/wechat

The asynchronous notification callback will be failing, because $app['request'] is empty, give it a value.

public function notify(Request $request)
{
    $app = $this->getPayment();//Get payment instance
    $app['request'] = $request;//Add this line to the original code and assign the current request instance to $app['request']
    $response = $app->handlePaidNotify(function ($message, $fail) use($id) {
        //...
    });
    return $response;
}

Use package laracasts/flash

Flash messages are held in memory all the time. Appending to $messages when call flash() every time, leads to the multiple messages. There are two solutions.

1.Reset $messages by middleware app('flash')->clear();.

2.Re-register FlashServiceProvider after handling request, Refer register_providers.

Singleton controller

1.Incorrect usage.

namespace App\Http\Controllers;
class TestController extends Controller
{
    protected $userId;
    public function __construct()
    {
        // Incorrect usage: TestController is singleton instance, subsequent requests will misread the userId generated by the first request.
        $this->userId = session('userId');
    }
    public function testAction()
    {
        // read $this->userId;
    }
}

2.Correct usage.

namespace App\Http\Controllers;
class TestController extends Controller
{
    protected function getUserId()
    {
        return session('userId');
    }
    public function testAction()
    {
        // call $this->getUserId() to get $userId
    }
}

Cannot call these functions

  • flush/ob_flush/ob_end_flush/ob_implicit_flush: swoole_http_response does not support flush.

  • dd()/exit()/die(): will lead to Worker/Task/Process quit right now, suggest jump out function call stack by throwing exception.

  • header()/setcookie()/http_response_code(): Make HTTP response by Laravel/Lumen Response only in LaravelS underlying.

Cannot use these global variables

  • $_GET/$_POST/$_FILES/$_COOKIE/$_REQUEST/$_SESSION/$GLOBALS, $_ENV is readable, $_SERVER is partial readable.

Size restriction

  • The max size of GET request's header is 8KB, restricted by Swoole, the big Cookie will lead to parse Cookie fail.

  • The max size of POST data/file is restricted by Swoole package_max_length, default 2M.

Inotify reached the watchers limit

Warning: inotify_add_watch(): The user limit on the total number of inotify watches was reached

  • Inotify limit is default 8192 for most Linux, but the amount of actual project may be more than it, then lead to watch fail.

  • Increase the amount of inotify watchers to 524288: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p, note: you need to enable privileged for Docker.

include/require与(include/require)_once

See Laruence's blog Do NOT USE (include/require)_once

  • To include the files about class/interface/trait/function, sugguest to use (include/require)_once. In other cases, use include/require.

  • In the multi-process mode, the child process inherits the parent process resource. Once the parent process includes a file that needs to be executed, the child process will directly return true when it uses require_once(), causing the file to fail to execute. Now, you need to use include/require.

If Swoole < 1.9.17

After enabling handle_static, static resource files will be handled by LaravelS. Due to the PHP environment, MimeTypeGuesser may not correctly recognize MimeType. For example, Javascript and CSS files will be recognized as text/plain.

Solutions:

1.Upgrade Swoole to 1.9.17+.

2.Register a custom MIME guesser.

// MyGuessMimeType.php
use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface;
class MyGuessMimeType implements MimeTypeGuesserInterface
{
    protected static $map = [
        'js'  => 'application/javascript',
        'css' => 'text/css',
    ];
    public function guess($path)
    {
        $ext = pathinfo($path, PATHINFO_EXTENSION);
        if (strlen($ext) > 0) {
            return Arr::get(self::$map, $ext);
        } else {
            return null;
        }
    }
}
// AppServiceProvider.php
use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser;
public function boot()
{
    MimeTypeGuesser::getInstance()->register(new MyGuessMimeType());
}