Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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: 3 days ago
JSON representation
π PHP Runtime for β² Vercel Serverless Functions (support 7.4-8.3)
- Host: GitHub
- URL: https://github.com/vercel-community/php
- Owner: vercel-community
- License: mit
- Created: 2019-07-26T16:31:08.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2024-10-19T10:43:20.000Z (2 months ago)
- Last Synced: 2024-10-29T15:19:38.007Z (about 2 months ago)
- Topics: aws, lambda, php, runtime, serverless, vercel
- Language: TypeScript
- Homepage: https://php.vercel.app
- Size: 107 MB
- Stars: 1,264
- Watchers: 20
- Forks: 293
- Open Issues: 37
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
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-3.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.