mirror of
https://github.com/laravel/valet.git
synced 2026-02-05 16:40:05 +01:00
working on php fpm refactor
This commit is contained in:
@@ -7,40 +7,38 @@
|
|||||||
|
|
||||||
class PhpFpm
|
class PhpFpm
|
||||||
{
|
{
|
||||||
|
var $brew, $cli;
|
||||||
|
|
||||||
|
var $taps = [
|
||||||
|
'homebrew/dupes', 'homebrew/versions', 'homebrew/homebrew-php'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new PHP FPM class instance.
|
||||||
|
*
|
||||||
|
* @param Brew $brew
|
||||||
|
* @param CommandLine $cli
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function __construct(Brew $brew, CommandLine $cli)
|
||||||
|
{
|
||||||
|
$this->cli = $cli;
|
||||||
|
$this->brew = $brew;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Install and configure DnsMasq.
|
* Install and configure DnsMasq.
|
||||||
*
|
*
|
||||||
* @param OutputInterface $output
|
* @param OutputInterface $output
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function install($output)
|
function install($output)
|
||||||
{
|
{
|
||||||
if (! Brew::hasInstalledPhp()) {
|
$this->brew->ensureInstalled('php70', $this->taps);
|
||||||
static::download($output);
|
|
||||||
}
|
|
||||||
|
|
||||||
static::updateConfiguration();
|
$this->updateConfiguration();
|
||||||
|
|
||||||
static::restart();
|
$this->restart();
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Download a fresh copy of PHP 7.0 from Brew.
|
|
||||||
*
|
|
||||||
* @param OutputInterface $output
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function download($output)
|
|
||||||
{
|
|
||||||
$output->writeln('<info>PHP 7.0 is not installed, installing it now via Brew...</info> 🍻');
|
|
||||||
|
|
||||||
Brew::tap('homebrew/dupes', 'homebrew/versions', 'homebrew/homebrew-php');
|
|
||||||
|
|
||||||
run('brew install php70', function ($exitCode, $processOutput) use ($output) {
|
|
||||||
$output->write($processOutput);
|
|
||||||
|
|
||||||
throw new Exception('We were unable to install PHP.');
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,11 +46,11 @@ public static function download($output)
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function updateConfiguration()
|
function updateConfiguration()
|
||||||
{
|
{
|
||||||
quietly('sed -i "" -E "s/^user = .+$/user = '.$_SERVER['SUDO_USER'].'/" '.static::fpmConfigPath());
|
$this->cli->quietly('sed -i "" -E "s/^user = .+$/user = '.user().'/" '.$this->fpmConfigPath());
|
||||||
|
|
||||||
quietly('sed -i "" -E "s/^group = .+$/group = staff/" '.static::fpmConfigPath());
|
$this->cli->quietly('sed -i "" -E "s/^group = .+$/group = staff/" '.$this->fpmConfigPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -60,11 +58,11 @@ public static function updateConfiguration()
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function restart()
|
function restart()
|
||||||
{
|
{
|
||||||
static::stop();
|
$this->stop();
|
||||||
|
|
||||||
Brew::restartLinkedPhp();
|
$this->brew->restartLinkedPhp();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -72,9 +70,9 @@ public static function restart()
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function stop()
|
function stop()
|
||||||
{
|
{
|
||||||
Brew::stopService('php56', 'php70');
|
$this->brew->stopService('php56', 'php70');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -82,9 +80,9 @@ public static function stop()
|
|||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
protected static function fpmConfigPath()
|
function fpmConfigPath()
|
||||||
{
|
{
|
||||||
if (Brew::linkedPhp() === 'php70') {
|
if ($this->brew->linkedPhp() === 'php70') {
|
||||||
return '/usr/local/etc/php/7.0/php-fpm.d/www.conf';
|
return '/usr/local/etc/php/7.0/php-fpm.d/www.conf';
|
||||||
} else {
|
} else {
|
||||||
return '/usr/local/etc/php/5.6/php-fpm.conf';
|
return '/usr/local/etc/php/5.6/php-fpm.conf';
|
||||||
|
|||||||
@@ -30,12 +30,12 @@ public function test_brew_can_be_resolved_from_container()
|
|||||||
public function test_installed_returns_true_when_given_formula_is_installed()
|
public function test_installed_returns_true_when_given_formula_is_installed()
|
||||||
{
|
{
|
||||||
$cli = Mockery::mock(CommandLine::class);
|
$cli = Mockery::mock(CommandLine::class);
|
||||||
$cli->shouldReceive('run')->with('brew list | grep php70')->andReturn('php70');
|
$cli->shouldReceive('run')->once()->with('brew list | grep php70')->andReturn('php70');
|
||||||
swap(CommandLine::class, $cli);
|
swap(CommandLine::class, $cli);
|
||||||
$this->assertTrue(resolve(Brew::class)->installed('php70'));
|
$this->assertTrue(resolve(Brew::class)->installed('php70'));
|
||||||
|
|
||||||
$cli = Mockery::mock(CommandLine::class);
|
$cli = Mockery::mock(CommandLine::class);
|
||||||
$cli->shouldReceive('run')->with('brew list | grep php70')->andReturn('php70-mcrypt
|
$cli->shouldReceive('run')->once()->with('brew list | grep php70')->andReturn('php70-mcrypt
|
||||||
php70');
|
php70');
|
||||||
swap(CommandLine::class, $cli);
|
swap(CommandLine::class, $cli);
|
||||||
$this->assertTrue(resolve(Brew::class)->installed('php70'));
|
$this->assertTrue(resolve(Brew::class)->installed('php70'));
|
||||||
@@ -45,17 +45,17 @@ public function test_installed_returns_true_when_given_formula_is_installed()
|
|||||||
public function test_installed_returns_false_when_given_formula_is_not_installed()
|
public function test_installed_returns_false_when_given_formula_is_not_installed()
|
||||||
{
|
{
|
||||||
$cli = Mockery::mock(CommandLine::class);
|
$cli = Mockery::mock(CommandLine::class);
|
||||||
$cli->shouldReceive('run')->with('brew list | grep php70')->andReturn('');
|
$cli->shouldReceive('run')->once()->with('brew list | grep php70')->andReturn('');
|
||||||
swap(CommandLine::class, $cli);
|
swap(CommandLine::class, $cli);
|
||||||
$this->assertFalse(resolve(Brew::class)->installed('php70'));
|
$this->assertFalse(resolve(Brew::class)->installed('php70'));
|
||||||
|
|
||||||
$cli = Mockery::mock(CommandLine::class);
|
$cli = Mockery::mock(CommandLine::class);
|
||||||
$cli->shouldReceive('run')->with('brew list | grep php70')->andReturn('php70-mcrypt');
|
$cli->shouldReceive('run')->once()->with('brew list | grep php70')->andReturn('php70-mcrypt');
|
||||||
swap(CommandLine::class, $cli);
|
swap(CommandLine::class, $cli);
|
||||||
$this->assertFalse(resolve(Brew::class)->installed('php70'));
|
$this->assertFalse(resolve(Brew::class)->installed('php70'));
|
||||||
|
|
||||||
$cli = Mockery::mock(CommandLine::class);
|
$cli = Mockery::mock(CommandLine::class);
|
||||||
$cli->shouldReceive('run')->with('brew list | grep php70')->andReturn('php70-mcrypt
|
$cli->shouldReceive('run')->once()->with('brew list | grep php70')->andReturn('php70-mcrypt
|
||||||
php70-something-else
|
php70-something-else
|
||||||
php7');
|
php7');
|
||||||
swap(CommandLine::class, $cli);
|
swap(CommandLine::class, $cli);
|
||||||
@@ -66,18 +66,18 @@ public function test_installed_returns_false_when_given_formula_is_not_installed
|
|||||||
public function test_has_installed_php_indicates_if_php_is_installed_via_brew()
|
public function test_has_installed_php_indicates_if_php_is_installed_via_brew()
|
||||||
{
|
{
|
||||||
$brew = Mockery::mock(Brew::class.'[installed]', [new CommandLine, new Filesystem]);
|
$brew = Mockery::mock(Brew::class.'[installed]', [new CommandLine, new Filesystem]);
|
||||||
$brew->shouldReceive('installed')->with('php70')->andReturn(true);
|
$brew->shouldReceive('installed')->once()->with('php70')->andReturn(true);
|
||||||
$brew->shouldReceive('installed')->with('php56')->andReturn(true);
|
$brew->shouldReceive('installed')->with('php56')->andReturn(true);
|
||||||
$this->assertTrue($brew->hasInstalledPhp());
|
$this->assertTrue($brew->hasInstalledPhp());
|
||||||
|
|
||||||
$brew = Mockery::mock(Brew::class.'[installed]', [new CommandLine, new Filesystem]);
|
$brew = Mockery::mock(Brew::class.'[installed]', [new CommandLine, new Filesystem]);
|
||||||
$brew->shouldReceive('installed')->with('php70')->andReturn(true);
|
$brew->shouldReceive('installed')->once()->with('php70')->andReturn(true);
|
||||||
$brew->shouldReceive('installed')->with('php56')->andReturn(false);
|
$brew->shouldReceive('installed')->with('php56')->andReturn(false);
|
||||||
$this->assertTrue($brew->hasInstalledPhp());
|
$this->assertTrue($brew->hasInstalledPhp());
|
||||||
|
|
||||||
$brew = Mockery::mock(Brew::class.'[installed]', [new CommandLine, new Filesystem]);
|
$brew = Mockery::mock(Brew::class.'[installed]', [new CommandLine, new Filesystem]);
|
||||||
$brew->shouldReceive('installed')->with('php70')->andReturn(false);
|
$brew->shouldReceive('installed')->once()->with('php70')->andReturn(false);
|
||||||
$brew->shouldReceive('installed')->with('php56')->andReturn(false);
|
$brew->shouldReceive('installed')->once()->with('php56')->andReturn(false);
|
||||||
$this->assertFalse($brew->hasInstalledPhp());
|
$this->assertFalse($brew->hasInstalledPhp());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,8 +85,8 @@ public function test_has_installed_php_indicates_if_php_is_installed_via_brew()
|
|||||||
public function test_tap_taps_the_given_homebrew_repository()
|
public function test_tap_taps_the_given_homebrew_repository()
|
||||||
{
|
{
|
||||||
$cli = Mockery::mock(CommandLine::class);
|
$cli = Mockery::mock(CommandLine::class);
|
||||||
$cli->shouldReceive('passthru')->with('sudo -u Taylor brew tap php70');
|
$cli->shouldReceive('passthru')->once()->with('sudo -u Taylor brew tap php70');
|
||||||
$cli->shouldReceive('passthru')->with('sudo -u Taylor brew tap php56');
|
$cli->shouldReceive('passthru')->once()->with('sudo -u Taylor brew tap php56');
|
||||||
swap(CommandLine::class, $cli);
|
swap(CommandLine::class, $cli);
|
||||||
resolve(Brew::class)->tap('php70', 'php56');
|
resolve(Brew::class)->tap('php70', 'php56');
|
||||||
}
|
}
|
||||||
@@ -95,7 +95,7 @@ public function test_tap_taps_the_given_homebrew_repository()
|
|||||||
public function test_restart_restarts_the_service_using_homebrew_services()
|
public function test_restart_restarts_the_service_using_homebrew_services()
|
||||||
{
|
{
|
||||||
$cli = Mockery::mock(CommandLine::class);
|
$cli = Mockery::mock(CommandLine::class);
|
||||||
$cli->shouldReceive('quietly')->with('sudo brew services restart dnsmasq');
|
$cli->shouldReceive('quietly')->once()->with('sudo brew services restart dnsmasq');
|
||||||
swap(CommandLine::class, $cli);
|
swap(CommandLine::class, $cli);
|
||||||
resolve(Brew::class)->restartService('dnsmasq');
|
resolve(Brew::class)->restartService('dnsmasq');
|
||||||
}
|
}
|
||||||
@@ -104,7 +104,7 @@ public function test_restart_restarts_the_service_using_homebrew_services()
|
|||||||
public function test_stop_stops_the_service_using_homebrew_services()
|
public function test_stop_stops_the_service_using_homebrew_services()
|
||||||
{
|
{
|
||||||
$cli = Mockery::mock(CommandLine::class);
|
$cli = Mockery::mock(CommandLine::class);
|
||||||
$cli->shouldReceive('quietly')->with('sudo brew services stop dnsmasq');
|
$cli->shouldReceive('quietly')->once()->with('sudo brew services stop dnsmasq');
|
||||||
swap(CommandLine::class, $cli);
|
swap(CommandLine::class, $cli);
|
||||||
resolve(Brew::class)->stopService('dnsmasq');
|
resolve(Brew::class)->stopService('dnsmasq');
|
||||||
}
|
}
|
||||||
@@ -113,14 +113,14 @@ public function test_stop_stops_the_service_using_homebrew_services()
|
|||||||
public function test_linked_php_returns_linked_php_formula_name()
|
public function test_linked_php_returns_linked_php_formula_name()
|
||||||
{
|
{
|
||||||
$files = Mockery::mock(Filesystem::class);
|
$files = Mockery::mock(Filesystem::class);
|
||||||
$files->shouldReceive('isLink')->with('/usr/local/bin/php')->andReturn(true);
|
$files->shouldReceive('isLink')->once()->with('/usr/local/bin/php')->andReturn(true);
|
||||||
$files->shouldReceive('readLink')->with('/usr/local/bin/php')->andReturn('/test/path/php70/test');
|
$files->shouldReceive('readLink')->once()->with('/usr/local/bin/php')->andReturn('/test/path/php70/test');
|
||||||
swap(Filesystem::class, $files);
|
swap(Filesystem::class, $files);
|
||||||
$this->assertEquals('php70', resolve(Brew::class)->linkedPhp());
|
$this->assertEquals('php70', resolve(Brew::class)->linkedPhp());
|
||||||
|
|
||||||
$files = Mockery::mock(Filesystem::class);
|
$files = Mockery::mock(Filesystem::class);
|
||||||
$files->shouldReceive('isLink')->with('/usr/local/bin/php')->andReturn(true);
|
$files->shouldReceive('isLink')->once()->with('/usr/local/bin/php')->andReturn(true);
|
||||||
$files->shouldReceive('readLink')->with('/usr/local/bin/php')->andReturn('/test/path/php56/test');
|
$files->shouldReceive('readLink')->once()->with('/usr/local/bin/php')->andReturn('/test/path/php56/test');
|
||||||
swap(Filesystem::class, $files);
|
swap(Filesystem::class, $files);
|
||||||
$this->assertEquals('php56', resolve(Brew::class)->linkedPhp());
|
$this->assertEquals('php56', resolve(Brew::class)->linkedPhp());
|
||||||
}
|
}
|
||||||
@@ -132,7 +132,7 @@ public function test_linked_php_returns_linked_php_formula_name()
|
|||||||
public function test_linked_php_throws_exception_if_no_php_link()
|
public function test_linked_php_throws_exception_if_no_php_link()
|
||||||
{
|
{
|
||||||
$files = Mockery::mock(Filesystem::class);
|
$files = Mockery::mock(Filesystem::class);
|
||||||
$files->shouldReceive('isLink')->with('/usr/local/bin/php')->andReturn(false);
|
$files->shouldReceive('isLink')->once()->with('/usr/local/bin/php')->andReturn(false);
|
||||||
swap(Filesystem::class, $files);
|
swap(Filesystem::class, $files);
|
||||||
resolve(Brew::class)->linkedPhp();
|
resolve(Brew::class)->linkedPhp();
|
||||||
}
|
}
|
||||||
@@ -144,8 +144,8 @@ public function test_linked_php_throws_exception_if_no_php_link()
|
|||||||
public function test_linked_php_throws_exception_if_unsupported_php_version_is_linked()
|
public function test_linked_php_throws_exception_if_unsupported_php_version_is_linked()
|
||||||
{
|
{
|
||||||
$files = Mockery::mock(Filesystem::class);
|
$files = Mockery::mock(Filesystem::class);
|
||||||
$files->shouldReceive('isLink')->with('/usr/local/bin/php')->andReturn(true);
|
$files->shouldReceive('isLink')->once()->with('/usr/local/bin/php')->andReturn(true);
|
||||||
$files->shouldReceive('readLink')->with('/usr/local/bin/php')->andReturn('/test/path/php42/test');
|
$files->shouldReceive('readLink')->once()->with('/usr/local/bin/php')->andReturn('/test/path/php42/test');
|
||||||
swap(Filesystem::class, $files);
|
swap(Filesystem::class, $files);
|
||||||
resolve(Brew::class)->linkedPhp();
|
resolve(Brew::class)->linkedPhp();
|
||||||
}
|
}
|
||||||
@@ -154,7 +154,7 @@ public function test_linked_php_throws_exception_if_unsupported_php_version_is_l
|
|||||||
public function test_install_or_fail_will_install_brew_formulas()
|
public function test_install_or_fail_will_install_brew_formulas()
|
||||||
{
|
{
|
||||||
$cli = Mockery::mock(CommandLine::class);
|
$cli = Mockery::mock(CommandLine::class);
|
||||||
$cli->shouldReceive('run')->with('brew install dnsmasq', Mockery::type('Closure'));
|
$cli->shouldReceive('run')->once()->with('brew install dnsmasq', Mockery::type('Closure'));
|
||||||
swap(CommandLine::class, $cli);
|
swap(CommandLine::class, $cli);
|
||||||
resolve(Brew::class)->installOrFail('dnsmasq');
|
resolve(Brew::class)->installOrFail('dnsmasq');
|
||||||
}
|
}
|
||||||
@@ -163,10 +163,10 @@ public function test_install_or_fail_will_install_brew_formulas()
|
|||||||
public function test_install_or_fail_can_install_taps()
|
public function test_install_or_fail_can_install_taps()
|
||||||
{
|
{
|
||||||
$cli = Mockery::mock(CommandLine::class);
|
$cli = Mockery::mock(CommandLine::class);
|
||||||
$cli->shouldReceive('run')->with('brew install dnsmasq', Mockery::type('Closure'));
|
$cli->shouldReceive('run')->once()->with('brew install dnsmasq', Mockery::type('Closure'));
|
||||||
swap(CommandLine::class, $cli);
|
swap(CommandLine::class, $cli);
|
||||||
$brew = Mockery::mock(Brew::class.'[tap]', [$cli, new Filesystem]);
|
$brew = Mockery::mock(Brew::class.'[tap]', [$cli, new Filesystem]);
|
||||||
$brew->shouldReceive('tap')->with(['test/tap']);
|
$brew->shouldReceive('tap')->once()->with(['test/tap']);
|
||||||
$brew->installOrFail('dnsmasq', ['test/tap']);
|
$brew->installOrFail('dnsmasq', ['test/tap']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ public function tearDown()
|
|||||||
public function test_install_installs_and_places_configuration_files_in_proper_locations()
|
public function test_install_installs_and_places_configuration_files_in_proper_locations()
|
||||||
{
|
{
|
||||||
$brew = Mockery::mock(Brew::class);
|
$brew = Mockery::mock(Brew::class);
|
||||||
$brew->shouldReceive('ensureInstalled')->with('dnsmasq');
|
$brew->shouldReceive('ensureInstalled')->once()->with('dnsmasq');
|
||||||
$brew->shouldReceive('restartService')->with('dnsmasq');
|
$brew->shouldReceive('restartService')->once()->with('dnsmasq');
|
||||||
swap(Brew::class, $brew);
|
swap(Brew::class, $brew);
|
||||||
|
|
||||||
$dnsMasq = resolve(StubForCreatingCustomDnsMasqConfigFiles::class);
|
$dnsMasq = resolve(StubForCreatingCustomDnsMasqConfigFiles::class);
|
||||||
|
|||||||
45
tests/PhpFpmTest.php
Normal file
45
tests/PhpFpmTest.php
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Valet\Brew;
|
||||||
|
use Valet\PhpFpm;
|
||||||
|
use Valet\CommandLine;
|
||||||
|
use Illuminate\Container\Container;
|
||||||
|
|
||||||
|
class PhpFpmTest extends PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
$_SERVER['SUDO_USER'] = 'Taylor';
|
||||||
|
|
||||||
|
Container::setInstance(new Container);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function tearDown()
|
||||||
|
{
|
||||||
|
exec('rm -rf '.__DIR__.'/output');
|
||||||
|
mkdir(__DIR__.'/output');
|
||||||
|
touch(__DIR__.'/output/.gitkeep');
|
||||||
|
|
||||||
|
Mockery::close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function test_update_configuration_replaces_user_and_group_in_config_file()
|
||||||
|
{
|
||||||
|
copy(__DIR__.'/files/fpm.conf', __DIR__.'/output/fpm.conf');
|
||||||
|
resolve(StubForUpdatingFpmConfigFiles::class)->updateConfiguration();
|
||||||
|
$contents = file_get_contents(__DIR__.'/output/fpm.conf');
|
||||||
|
$this->assertTrue(strpos($contents, 'user = '.user()) !== false);
|
||||||
|
$this->assertTrue(strpos($contents, 'group = staff') !== false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class StubForUpdatingFpmConfigFiles extends PhpFpm
|
||||||
|
{
|
||||||
|
function fpmConfigPath()
|
||||||
|
{
|
||||||
|
return __DIR__.'/output/fpm.conf';
|
||||||
|
}
|
||||||
|
}
|
||||||
6
tests/files/fpm.conf
Normal file
6
tests/files/fpm.conf
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Test contents
|
||||||
|
|
||||||
|
user = something
|
||||||
|
group = something-else
|
||||||
|
|
||||||
|
more contents
|
||||||
Reference in New Issue
Block a user