Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/vercel-community/php

🐘 PHP Runtime for β–² Vercel Serverless Functions (support 7.4-8.3)
https://github.com/vercel-community/php

aws lambda php runtime serverless vercel

Last synced: about 2 months ago
JSON representation

🐘 PHP Runtime for β–² Vercel Serverless Functions (support 7.4-8.3)

Awesome Lists containing this project

README

        

PHP Runtime for Vercel


Enjoyable & powerful 🐘 PHP Runtime (php.vercel.app) for Vercel platform.













πŸ‹οΈβ€β™€οΈ It works with these frameworks and tools. Discover more at examples.


Made with ❀️ by @f3l1x (f3l1x.io) β€’ 🐦 @xf3l1x

-----

## 😎 Getting Started

Let's picture you want to deploy your awesome microproject written in PHP and you don't know where. You have found [Vercel](https://vercel.com) it's awesome, but for static sites. Not anymore! I would like to introduce you your new best friend `vercel-php`, PHP runtime for Vercel platform.

Most simple example project is this one, using following project structure.

```sh
project
β”œβ”€β”€ api
β”‚ └── index.php
└── vercel.json
```

First file `api/index.php` is entrypoint of our application. It should be placed in **api** folder, it's very standard location for Vercel.

```php

## πŸ€— Features

- **Architecture**: PHP development server (πŸš€ fast enough)
- **PHP version**: 8.3 (https://example-php-8-2.vercel.app)
- **Extensions**: apcu, bcmath, brotli, bz2, calendar, Core, ctype, curl, date, dom, ds, exif, fileinfo, filter, ftp, geoip, gettext, hash, iconv, igbinary, imap, intl, json, libxml, lua, mbstring, mongodb, msgpack, mysqli, mysqlnd, openssl, pcntl, pcre, PDO, pdo_mysql, pdo_pgsql, pdo_sqlite, pgsql, phalcon, Phar, protobuf, readline, redis, Reflection, runkit7, session, SimpleXML, soap, sockets, sodium, SPL, sqlite3, standard, swoole, timecop, tokenizer, uuid, xml, xmlreader, xmlrpc, xmlwriter, xsl, Zend OPcache, zlib, zip
- **Speed**: cold ~250ms / warm ~5ms
- **Memory**: ~90mb
- **Frameworks**: Nette, Symfony, Lumen, Slim, Phalcon

> List of all installable extensions is on this page https://blog.remirepo.net/pages/PECL-extensions-RPM-status.

## πŸ’― Versions

- `[email protected]` - Node autodetect / PHP 8.3.x (https://example-php-8-3.vercel.app)
- `[email protected]` - Node autodetect / PHP 8.2.x (https://example-php-8-2.vercel.app)
- `[email protected]` - Node autodetect / PHP 8.1.x (https://example-php-8-1.vercel.app)
- `[email protected]` - Node autodetect / PHP 8.0.x (https://example-php-8-0.vercel.app)
- `[email protected]` - Node autodetect / PHP 7.4.x (https://example-php-7-4.vercel.app)

## βš™οΈ Usage

Before you can start using this runtime, you should learn about Vercel and [how runtimes](https://vercel.com/docs/runtimes?query=runtime#official-runtimes) works. Take a look at blogpost about [`Serverless Functions`](https://vercel.com/blog/customizing-serverless-functions).

You should define `functions` property in `vercel.json` and list PHP files directly or using wildcard (*).
If you need to route everything to index, use `routes` property.

```json
{
"functions": {
"api/*.php": {
"runtime": "[email protected]"
}
},
"routes": [
{ "src": "/(.*)", "dest": "/api/index.php" }
]
}
```

Do you have more questions (❓)? Let's move to [FAQ](#%EF%B8%8F-faq).

## πŸ‘¨β€πŸ’» `vercel dev`

For running `vercel dev` properly, you need to have PHP installed on your computer, [learn more](errors/now-dev-no-local-php.md).
But it's PHP and as you know PHP has built-in development server. It works out of box.

```
php -S localhost:8000 api/index.php
```

## πŸ‘€ Demo

- official - https://php.vercel.app/
- phpinfo - https://phpshow.vercel.app/
- extensions - https://phpshow.vercel.app/ext/
- ini - https://phpshow.vercel.app/ini/
- JSON API - https://phpshow.vercel.app/api/users.php
- test - https://phpshow.vercel.app/test.php

![PHP](https://api.microlink.io?url=https://phpshow.vercel.app&screenshot&embed=screenshot.url)

## 🎯Examples

- [PHP - fast & simple](https://github.com/juicyfx/vercel-examples/tree/master/php/)
- [Composer - install dependencies](https://github.com/juicyfx/vercel-examples/tree/master/php-composer/)
- [Framework - Laravel](https://github.com/juicyfx/vercel-examples/blob/master/php-laravel)
- [Framework - Lumen](https://github.com/juicyfx/vercel-examples/blob/master/php-lumen)
- [Framework - Nette](https://github.com/juicyfx/vercel-examples/blob/master/php-nette-tracy)
- [Framework - Phalcon](https://github.com/juicyfx/vercel-examples/blob/master/php-phalcon)
- [Framework - Slim](https://github.com/juicyfx/vercel-examples/blob/master/php-slim)
- [Framework - Symfony - Microservice](https://github.com/juicyfx/vercel-examples/blob/master/php-symfony-microservice)

Browse [more examples](https://github.com/juicyfx/vercel-examples). πŸ‘€

## πŸ“œ Resources

- [2019/10/23 - Code Examples](https://github.com/trainit/2019-10-hubbr-zeit)
- [2019/10/19 - ZEIT - Deploy Serverless Microservices Right Now](https://slides.com/f3l1x/2019-10-19-zeit-deploy-serverless-microservices-right-now-vol2)
- [2019/08/23 - Code Examples](https://github.com/trainit/2019-08-serverless-zeit-now)
- [2019/07/07 - Bleeding Edge PHP on ZEIT Now](https://dev.to/nx1/bleeding-edge-php-on-zeit-now-565g)
- [2019/06/06 - Code Examples](https://github.com/trainit/2019-06-zeit-now)
- [2019/06/05 - ZEIT - Deploy Serverless Microservices Right Now](https://slides.com/f3l1x/2019-06-05-zeit-deploy-serverless-microservices-right-now) ([VIDEO](https://www.youtube.com/watch?v=IwhEGNDx3aE))

## 🚧 Roadmap

See [roadmap issue](https://github.com/juicyfx/vercel-php/issues/3). Help wanted.

## ⁉️ FAQ

1. How to use more then one endpoint (index.php)?

```sh
project
β”œβ”€β”€ api
β”‚ β”œβ”€β”€ index.php
β”‚ β”œβ”€β”€ users.php
β”‚ └── books.php
└── vercel.json
```

```
{
"functions": {
"api/*.php": {
"runtime": "[email protected]"
},

// Can be list also directly

"api/index.php": {
"runtime": "[email protected]"
},
"api/users.php": {
"runtime": "[email protected]"
},
"api/books.php": {
"runtime": "[email protected]"
}
}
}
```

2. How to route everything to index?

```json
{
"functions": {
"api/index.php": {
"runtime": "[email protected]"
}
},
"routes": [
{ "src": "/(.*)", "dest": "/api/index.php" }
]
}
```

3. How to update memory limit?

Additional function properties are `memory`, `maxDuration`. Learn more about [functions](https://vercel.com/docs/configuration#project/functions).

```json
{
"functions": {
"api/*.php": {
"runtime": "[email protected]",
"memory": 3008,
"maxDuration": 60
}
}
}
```

4. How to use it with Composer?

Yes, [Composer](https://getcomposer.org/) is fully supported.

```sh
project
β”œβ”€β”€ api
β”‚ └── index.php
β”œβ”€β”€ composer.json
└── vercel.json
```

```json
{
"functions": {
"api/*.php": {
"runtime": "[email protected]"
}
}
}
```

```json
{
"require": {
"php": "^8.1",
"tracy/tracy": "^2.0"
}
}
```

It's also good thing to create `.vercelignore` file and put `/vendor` folder to this file. It will not upload
`/vendor` folder to Vercel platform.

5. How to override php.ini / php configuration ?

Yes, you can override php configuration. Take a look at [default configuration](https://phpshow.vercel.app/) at first.
Create a new file `api/php.ini` and place there your configuration. Don't worry, this particulary file will be
removed during building phase on Vercel.

```sh
project
β”œβ”€β”€ api
β”‚ β”œβ”€β”€ index.php
β”‚ └── php.ini
└── vercel.json
```

```json
{
"functions": {
"api/*.php": {
"runtime": "[email protected]"
}
}
}
```

```json
# Disable some functions
disable_functions = "exec, system"

# Update memory limit
memory_limit=1024M
```

6. How to exclude some files or folders ?

Runtimes support excluding some files or folders, [take a look at doc](https://vercel.com/docs/configuration?query=excludeFiles#project/functions).

```json
{
"functions": {
"api/**/*.php": {
"runtime": "[email protected]",
"excludeFiles": "{foo/**,bar/config/*.yaml}",
}
}
```

If you want to exclude files before uploading them to Vercel, use `.vercelignore` file.

7. How to call composer script(s) ?

Calling composer scripts during build phase on Vercel is supported via script named `vercel`. You can easilly call php, npm or node.

```json
{
"require": { ... },
"require-dev": { ... },
"scripts": {
"vercel": [
"@php -v",
"npm -v"
]
}
}
```

Files created during `composer run vercel` script can be used (require/include) in your PHP lambdas, but can't be accessed from browser (like assets). If you still want to access them, create fake `assets.php` lambda and require them. [Example of PHP satis](https://github.com/juicyfx/vercel-examples/tree/master/php-satis).

8. How to include some files of folders?

If you are looking for [`config.includeFiles`](https://vercel.com/docs/configuration?query=includeFiles#project/functions) in runtime, unfortunately you can't include extra files.
All files in root folder are uploaded to Vercel, use `.vercelignore` to exclude them before upload.

9. How to develop locally?

I think the best way at this moment is use [PHP Development Server](https://www.php.net/manual/en/features.commandline.webserver.php).

```
php -S localhost:8000 api/index.php
```

## πŸ‘¨πŸ»β€πŸ’»CHANGELOG

Show me [CHANGELOG](./CHANGELOG.md)

## πŸ§™Contribution

1. Clone this repository.
- `git clone [email protected]:juicyfx/vercel-php.git`
2. Install NPM dependencies
- `make install`
3. Make your changes
4. Run TypeScript compiler
- `make build`
5. Run tests
- `make test`
6. Create a PR

## πŸ“ License

Copyright Β© 2019 [f3l1x](https://github.com/f3l1x).
This project is [MIT](LICENSE) licensed.