8000 Merge pull request #9 from NativePHP/custom-php-ini-settings · NativePHP/electron-plugin@8c077cb · GitHub
[go: up one dir, main page]

Skip to content
This repository was archived by the owner on Oct 18, 2024. It is now read-only.

Commit 8c077cb

Browse files
authored
Merge pull request #9 from NativePHP/custom-php-ini-settings
Custom php ini settings
2 parents dfea07a + 0b9387e commit 8c077cb

File tree

7 files changed

+110
-51
lines changed

7 files changed

+110
-51
lines changed

dist/index.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,14 @@ class NativePHP {
8989
catch (e) {
9090
console.error(e);
9191
}
92+
let phpIniSettings = {};
93+
try {
94+
let { stdout } = yield (0, server_1.retrievePhpIniSettings)();
95+
phpIniSettings = JSON.parse(stdout);
96+
}
97+
catch (e) {
98+
console.error(e);
99+
}
92100
utils_1.electronApp.setAppUserModelId(nativePHPConfig === null || nativePHPConfig === void 0 ? void 0 : nativePHPConfig.app_id);
93101
const deepLinkProtocol = nativePHPConfig === null || nativePHPConfig === void 0 ? void 0 : nativePHPConfig.deeplink_scheme;
94102
if (deepLinkProtocol) {
@@ -103,7 +111,7 @@ class NativePHP {
103111
}
104112
const apiPort = yield (0, server_1.startAPI)();
105113
console.log('API server started on port', apiPort.port);
106-
phpProcesses = yield (0, server_1.servePhpApp)(apiPort.port);
114+
phpProcesses = yield (0, server_1.servePhpApp)(apiPort.port, phpIniSettings);
107115
websocketProcess = (0, server_1.serveWebsockets)();
108116
yield (0, utils_2.notifyLaravel)('booted');
109117
if (((_a = nativePHPConfig === null || nativePHPConfig === void 0 ? void 0 : nativePHPConfig.updater) === null || _a === void 0 ? void 0 : _a.enabled) === true) {
@@ -114,7 +122,7 @@ class NativePHP {
114122
setTimeout(() => {
115123
schedulerInterval = setInterval(() => {
116124
console.log("Running scheduler...");
117-
(0, server_1.runScheduler)(apiPort.port);
125+
(0, server_1.runScheduler)(apiPort.port, phpIniSettings);
118126
}, 60 * 1000);
119127
}, delay);
120128
app.on('activate', function (event, hasVisibleWindows) {

dist/server/index.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,33 +12,34 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
1212
return (mod && mod.__esModule) ? mod : { "default": mod };
1313
};
1414
Object.defineProperty(exports, "__esModule", { value: true });
15-
exports.retrieveNativePHPConfig = exports.serveWebsockets = exports.startAPI = exports.startQueue = exports.runScheduler = exports.servePhpApp = void 0;
15+
exports.retrievePhpIniSettings = exports.retrieveNativePHPConfig = exports.serveWebsockets = exports.startAPI = exports.startQueue = exports.runScheduler = exports.servePhpApp = void 0;
1616
const websockets_1 = __importDefault(require("./websockets"));
1717
exports.serveWebsockets = websockets_1.default;
1818
const api_1 = __importDefault(require("./api"));
1919
const php_1 = require("./php");
2020
Object.defineProperty(exports, "retrieveNativePHPConfig", { enumerable: true, get: function () { return php_1.retrieveNativePHPConfig; } });
21+
Object.defineProperty(exports, "retrievePhpIniSettings", { enumerable: true, get: function () { return php_1.retrievePhpIniSettings; } });
2122
const utils_1 = require("./utils");
2223
const state_1 = __importDefault(require("./state"));
23-
function servePhpApp(apiPort) {
24+
function servePhpApp(apiPort, phpIniSettings) {
2425
return __awaiter(this, void 0, void 0, function* () {
2526
const processes = [];
26-
const result = yield (0, php_1.serveApp)(state_1.default.randomSecret, apiPort);
27+
const result = yield (0, php_1.serveApp)(state_1.default.randomSecret, apiPort, phpIniSettings);
2728
processes.push(result.process);
28-
processes.push((0, php_1.startQueueWorker)(state_1.default.randomSecret, apiPort));
29+
processes.push((0, php_1.startQueueWorker)(state_1.default.randomSecret, apiPort, phpIniSettings));
2930
state_1.default.phpPort = result.port;
3031
yield (0, utils_1.appendCookie)();
3132
return processes;
3233
});
3334
}
3435
exports.servePhpApp = servePhpApp;
35-
function runScheduler(apiPort) {
36-
(0, php_1.startScheduler)(state_1.default.randomSecret, apiPort);
36+
function runScheduler(apiPort, phpIniSettings) {
37+
(0, php_1.startScheduler)(state_1.default.randomSecret, apiPort, phpIniSettings);
3738
}
3839
exports.runScheduler = runScheduler;
39-
function startQueue(apiPort) {
40+
function startQueue(apiPort, phpIniSettings) {
4041
if (!process.env.NATIVE_PHP_SKIP_QUEUE) {
41-
return (0, php_1.startQueueWorker)(state_1.default.randomSecret, apiPort);
42+
return (0, php_1.startQueueWorker)(state_1.default.randomSecret, apiPort, phpIniSettings);
4243
}
4344
}
4445
exports.startQueue = startQueue;

dist/server/php.js

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
1212
return (mod && mod.__esModule) ? mod : { "default": mod };
1313
};
1414
Object.defineProperty(exports, "__esModule", { value: true });
15-
exports.retrieveNativePHPConfig = exports.getAppPath = exports.serveApp = exports.startScheduler = exports.startQueueWorker = void 0;
15+
exports.retrievePhpIniSettings = exports.retrieveNativePHPConfig = exports.getAppPath = exports.serveApp = exports.startScheduler = exports.startQueueWorker = void 0;
1616
const fs_1 = require("fs");
1717
const fs_extra_1 = require("fs-extra");
1818
const electron_store_1 = __importDefault(require("electron-store"));
@@ -35,6 +35,20 @@ function getPhpPort() {
3535
});
3636
});
3737
}
38+
function retrievePhpIniSettings() {
39+
return __awaiter(this, void 0, void 0, function* () {
40+
const env = {
41+
NATIVEPHP_STORAGE_PATH: storagePath,
42+
NATIVEPHP_DATABASE_PATH: databaseFile,
43+
};
44+
const phpOptions = {
45+
cwd: appPath,
46+
env
47+
};
48+
return yield (0, util_1.promisify)(child_process_1.execFile)(state_1.default.php, ['artisan', 'native:php-ini'], phpOptions);
49+
});
50+
}
51+
exports.retrievePhpIniSettings = retrievePhpIniSettings;
3852
function retrieveNativePHPConfig() {
3953
return __awaiter(this, void 0, void 0, function* () {
4054
const env = {
@@ -49,8 +63,16 @@ function retrieveNativePHPConfig() {
4963
});
5064
}
5165
exports.retrieveNativePHPConfig = retrieveNativePHPConfig;
52-
function callPhp(args, options) {
53-
args.unshift('-d', 'memory_limit=512M', '-d', 'curl.cainfo=' + state_1.default.caCert, '-d', 'openssl.cafile=' + state_1.default.caCert);
66+
function callPhp(args, options, phpIniSettings = {}) {
67+
let defaultIniSettings = {
68+
'memory_limit': '512M',
69+
'curl.cainfo': state_1.default.caCert,
70+
'openssl.cafile': state_1.default.caCert
71+
};
72+
let iniSettings = Object.assign(defaultIniSettings, phpIniSettings);
73+
Object.keys(iniSettings).forEach(key => {
74+
args.unshift('-d', `${key}=${iniSettings[key]}`);
75+
});
5476
return (0, child_process_1.spawn)(state_1.default.php, args, {
5577
cwd: options.cwd,
5678
env: Object.assign(Object.assign({}, process.env), options.env),
@@ -85,7 +107,7 @@ function ensureAppFoldersAreAvailable() {
85107
(0, fs_1.writeFileSync)(databaseFile, '');
86108
}
87109
}
88-
function startQueueWorker(secret, apiPort) {
110+
function startQueueWorker(secret, apiPort, phpIniSettings = {}) {
89111
const env = {
90112
APP_ENV: process.env.NODE_ENV === 'development' ? 'local' : 'production',
91113
APP_DEBUG: process.env.NODE_ENV === 'development' ? 'true' : 'false',
@@ -99,10 +121,10 @@ function startQueueWorker(secret, apiPort) {
99121
cwd: appPath,
100122
env
101123
};
102-
return callPhp(['artisan', 'queue:work'], phpOptions);
124+
return callPhp(['artisan', 'queue:work'], phpOptions, phpIniSettings);
103125
}
104126
exports.startQueueWorker = startQueueWorker;
105-
function startScheduler(secret, apiPort) {
127+
function startScheduler(secret, apiPort, phpIniSettings = {}) {
106128
const env = {
107129< F438 /code>
APP_ENV: process.env.NODE_ENV === 'development' ? 'local' : 'production',
108130
APP_DEBUG: process.env.NODE_ENV === 'development' ? 'true' : 'false',
@@ -116,13 +138,13 @@ function startScheduler(secret, apiPort) {
116138
cwd: appPath,
117139
env
118140
};
119-
return callPhp(['artisan', 'schedule:run'], phpOptions);
141+
return callPhp(['artisan', 'schedule:run'], phpOptions, phpIniSettings);
120142
}
121143
exports.startScheduler = startScheduler;
122-
function serveApp(secret, apiPort) {
144+
function serveApp(secret, apiPort, phpIniSettings) {
123145
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
124146
const appPath = getAppPath();
125-
console.log('Starting PHP server...', `${state_1.default.php} artisan serve`, appPath);
147+
console.log('Starting PHP server...', `${state_1.default.php} artisan serve`, appPath, phpIniSettings);
126148
ensureAppFoldersAreAvailable();
127149
console.log('Making sure app folders are available');
128150
const env = {
@@ -139,10 +161,10 @@ function serveApp(secret, apiPort) {
139161
env
140162
};
141163
const store = new electron_store_1.default();
142-
callPhp(['artisan', 'storage:link', '--force'], phpOptions);
164+
callPhp(['artisan', 'storage:link', '--force'], phpOptions, phpIniSettings);
143165
if (store.get('migrated_version') !== electron_1.app.getVersion() && process.env.NODE_ENV !== 'development') {
144166
console.log('Migrating database...');
145-
callPhp(['artisan', 'migrate', '--force'], phpOptions);
167+
callPhp(['artisan', 'migrate', '--force'], phpOptions, phpIniSettings);
146168
store.set('migrated_version', electron_1.app.getVersion());
147169
}
148170
if (process.env.NODE_ENV === 'development') {
@@ -154,7 +176,7 @@ function serveApp(secret, apiPort) {
154176
const phpServer = callPhp(['-S', `127.0.0.1:${phpPort}`, serverPath], {
155177
cwd: (0, path_1.join)(appPath, 'public'),
156178
env
157-
});
179+
}, phpIniSettings);
158180
const portRegex = /Development Server \(.*:([0-9]+)\) started/gm;
159181
phpServer.stdout.on('data', (data) => {
160182
const match = portRegex.exec(data.toString());

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@nativephp/electron-plugin",
3-
"version": "0.2.0",
3+
"version": "0.3.0",
44
"description": "NativePHP Electron support",
55
"license": "MIT",
66
"main": "dist/index.js",

src/index.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type CrossProcessExports from 'electron'
22
import { autoUpdater } from "electron-updater"
33
import state from './server/state'
44
import {electronApp, optimizer, is} from '@electron-toolkit/utils'
5-
import {startAPI, runScheduler, servePhpApp, serveWebsockets, retrieveNativePHPConfig} from './server'
5+
import {startAPI, runScheduler, servePhpApp, serveWebsockets, retrieveNativePHPConfig, retrievePhpIniSettings} from './server'
66
import {notifyLaravel} from "./server/utils";
77
import { app, BrowserWindow } from "electron";
88
import { resolve } from "path";
@@ -97,6 +97,14 @@ class NativePHP {
9797
console.error(e);
9898
}
9999

100+
let phpIniSettings = {};
101+
try {
102+
let {stdout} = await retrievePhpIniSettings()
103+
phpIniSettings = JSON.parse(stdout);
104+
} catch (e) {
105+
console.error(e);
106+
}
107+
100108
// @ts-ignore
101109
electronApp.setAppUserModelId(nativePHPConfig?.app_id)
102110

@@ -116,7 +124,7 @@ class NativePHP {
116124
const apiPort = await startAPI()
117125
console.log('API server started on port', apiPort.port);
118126

119-
phpProcesses = await servePhpApp(apiPort.port)
127+
phpProcesses = await servePhpApp(apiPort.port, phpIniSettings)
120128

121129
websocketProcess = serveWebsockets()
122130

@@ -133,7 +141,7 @@ class NativePHP {
133141
setTimeout(() => {
134142
schedulerInterval = setInterval(() => {
135143
console.log("Running scheduler...")
136-
runScheduler(apiPort.port);
144+
runScheduler(apiPort.port, phpIniSettings);
137145
}, 60 * 1000);
138146
}, delay);
139147

src/server/index.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,36 @@ import {
66
startScheduler,
77
serveApp,
88
retrieveNativePHPConfig,
9+
retrievePhpIniSettings,
910
} from "./php";
1011
import { appendCookie } from "./utils";
1112
import state from "./state";
1213

13-
export async function servePhpApp(apiPort: number) {
14+
export async function servePhpApp(apiPort: number, phpIniSettings: object) {
1415
const processes = [];
15-
const result = await serveApp(state.randomSecret, apiPort);
16+
const result = await serveApp(state.randomSecret, apiPort, phpIniSettings);
1617
processes.push(result.process);
1718

18-
processes.push(startQueueWorker(state.randomSecret, apiPort));
19+
processes.push(startQueueWorker(state.randomSecret, apiPort, phpIniSettings));
1920

2021
state.phpPort = result.port;
2122
await appendCookie();
2223

2324
return processes;
2425
}
2526

26-
export function runScheduler(apiPort: number) {
27-
startScheduler(state.randomSecret, apiPort);
27+
export function runScheduler(apiPort: number, phpIniSettings: object) {
28+
startScheduler(state.randomSecret, apiPort, phpIniSettings);
2829
}
2930

30-
export function startQueue(apiPort: number) {
31+
export function startQueue(apiPort: number, phpIniSettings: object) {
3132
if (!process.env.NATIVE_PHP_SKIP_QUEUE) {
32-
return startQueueWorker(state.randomSecret, apiPort);
33+
return startQueueWorker(state.randomSecret, apiPort, phpIniSettings);
3334
}
3435
}
3536

3637
export function startAPI(): Promise<APIProcess> {
3738
return startAPIServer(state.randomSecret);
3839
}
3940

40-
export { serveWebsockets, retrieveNativePHPConfig };
41+
export { serveWebsockets, retrieveNativePHPConfig, retrievePhpIniSettings };

src/server/php.ts

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,20 @@ async function getPhpPort() {
2222
});
2323
}
2424

25+
async function retrievePhpIniSettings() {
26+
const env = {
27+
NATIVEPHP_STORAGE_PATH: storagePath,
28+
NATIVEPHP_DATABASE_PATH: databaseFile,
29+
};
30+
31+
const phpOptions = {
32+
cwd: appPath,
33+
env
34+
};
35+
36+
return await promisify(execFile)(state.php, ['artisan', 'native:php-ini'], phpOptions);
37+
}
38+
2539
async function retrieveNativePHPConfig() {
2640
const env = {
2741
NATIVEPHP_STORAGE_PATH: storagePath,
@@ -36,13 +50,18 @@ async function retrieveNativePHPConfig() {
3650
return await promisify(execFile)(state.php, ['artisan', 'native:config'], phpOptions);
3751
}
3852

39-
function callPhp(args, options) {
40-
// Add mandatory php.ini settings
41-
args.unshift(
42-
'-d', 'memory_limit=512M',
43-
'-d', 'curl.cainfo=' + state.caCert,
44-
'-d', 'openssl.cafile=' + state.caCert
45-
);
53+
function callPhp(args, options, phpIniSettings = {}) {
54+
let defaultIniSettings = {
55+
'memory_limit': '512M',
56+
'curl.cainfo': state.caCert,
57+
'openssl.cafile': state.caCert
58+
}
59+
60+
let iniSettings = Object.assign(defaultIniSettings, phpIniSettings);
61+
62+
Object.keys(iniSettings).forEach(key => {
63+
args.unshift('-d', `${key}=${iniSettings[key]}`);
64+
});
4665

4766
return spawn(
4867
state.php,
@@ -98,7 +117,7 @@ function ensureAppFoldersAreAvailable() {
98117
}
99118
}
100119

101-
function startQueueWorker(secret, apiPort) {
120+
function startQueueWorker(secret, apiPort, phpIniSettings = {}) {
102121
const env = {
103122
APP_ENV: process.env.NODE_ENV === 'development' ? 'local' : 'production',
104123
APP_DEBUG: process.env.NODE_ENV === 'development' ? 'true' : 'false',
@@ -114,10 +133,10 @@ function startQueueWorker(secret, apiPort) {
114133
env
115134
};
116135

117-
return callPhp(['artisan', 'queue:work'], phpOptions);
136+
return callPhp(['artisan', 'queue:work'], phpOptions, phpIniSettings);
118137
}
119138

120-
function startScheduler(secret, apiPort) {
139+
function startScheduler(secret, apiPort, phpIniSettings = {}) {
121140
const env = {
122141
APP_ENV: process.env.NODE_ENV === 'development' ? 'local' : 'production',
123142
APP_DEBUG: process.env.NODE_ENV === 'development' ? 'true' : 'false',
@@ -133,14 +152,14 @@ function startScheduler(secret, apiPort) {
133152
env
134153
};
135154

136-
return callPhp(['artisan', 'schedule:run'], phpOptions);
155+
return callPhp(['artisan', 'schedule:run'], phpOptions, phpIniSettings);
137156
}
138157

139-
function serveApp(secret, apiPort): Promise<ProcessResult> {
158+
function serveApp(secret, apiPort, phpIniSettings): Promise<ProcessResult> {
140159
return new Promise(async (resolve, reject) => {
141160
const appPath = getAppPath();
142161

143-
console.log('Starting PHP server...', `${state.php} artisan serve`, appPath)
162+
console.log('Starting PHP server...', `${state.php} artisan serve`, appPath, phpIniSettings)
144163

145164
ensureAppFoldersAreAvailable();
146165

@@ -165,12 +184,12 @@ function serveApp(secret, apiPort): Promise<ProcessResult> {
165184

166185
// Make sure the storage path is linked - as people can move the app around, we
167186
// need to run this every time the app starts
168-
callPhp(['artisan', 'storage:link', '--force'], phpOptions)
187+
callPhp(['artisan', 'storage:link', '--force'], phpOptions, phpIniSettings)
169188

170189
// Migrate the database
171190
if (store.get('migrated_version') !== app.getVersion() && process.env.NODE_ENV !== 'development') {
172191
console.log('Migrating database...')
173-
callPhp(['artisan', 'migrate', '--force'], phpOptions)
192+
callPhp(['artisan', 'migrate', '--force'], phpOptions, phpIniSettings)
174193
store.set('migrated_version', app.getVersion())
175194
}
176195

@@ -185,7 +204,7 @@ function serveApp(secret, apiPort): Promise<ProcessResult> {
185204
const phpServer = callPhp(['-S', `127.0.0.1:${phpPort}`, serverPath], {
186205
cwd: join(appPath, 'public'),
187206
env
188-
})
207+
}, phpIniSettings)
189208

190209
const portRegex = /Development Server \(.*:([0-9]+)\) started/gm
191210

@@ -219,4 +238,4 @@ function serveApp(secret, apiPort): Promise<ProcessResult> {
219238
})
220239
}
221240

222-
export {startQueueWorker, startScheduler, serveApp, getAppPath, retrieveNativePHPConfig}
241+
export {startQueueWorker, startScheduler, serveApp, getAppPath, retrieveNativePHPConfig, retrievePhpIniSettings}

0 commit comments

Comments
 (0)
0