New php helper for dockerized cli scripts
This commit is contained in:
parent
283bac61eb
commit
fec161f77b
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/nbproject/private/
|
@ -1,6 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
$url = 'https://axenov.dev';
|
echo "Hello from php!" . PHP_EOL;
|
||||||
$data = ['phpstorm', 'netbeans'];
|
$data = ['phpstorm', 'netbeans'];
|
||||||
|
var_dump($data);
|
||||||
phpinfo();
|
$url = 'https://axenov.dev';
|
||||||
//var_dump($data);
|
|
2
app/subdir/file.php
Normal file
2
app/subdir/file.php
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<?php
|
||||||
|
echo 'Hello from subdir!';
|
@ -13,7 +13,7 @@ services:
|
|||||||
- test
|
- test
|
||||||
volumes:
|
volumes:
|
||||||
- ./php/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
|
- ./php/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
|
||||||
- ./index.php:/var/www/index.php
|
- ./app:/var/www
|
||||||
|
|
||||||
nginx:
|
nginx:
|
||||||
container_name: test-nginx
|
container_name: test-nginx
|
||||||
@ -23,7 +23,7 @@ services:
|
|||||||
- test
|
- test
|
||||||
volumes:
|
volumes:
|
||||||
- ./nginx/vhost.conf:/etc/nginx/conf.d/default.conf
|
- ./nginx/vhost.conf:/etc/nginx/conf.d/default.conf
|
||||||
- ./index.php:/var/www/index.php
|
- ./app:/var/www
|
||||||
ports:
|
ports:
|
||||||
- '8888:80'
|
- '8888:80'
|
||||||
links:
|
links:
|
||||||
|
0
nbproject/configs/proj.properties
Normal file
0
nbproject/configs/proj.properties
Normal file
1
nbproject/php
Symbolic link
1
nbproject/php
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../php/php
|
7
nbproject/project.properties
Normal file
7
nbproject/project.properties
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
include.path=${php.global.include.path}
|
||||||
|
php.version=PHP_81
|
||||||
|
source.encoding=UTF-8
|
||||||
|
src.dir=.
|
||||||
|
tags.asp=false
|
||||||
|
tags.short=false
|
||||||
|
web.root=.
|
9
nbproject/project.xml
Normal file
9
nbproject/project.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||||
|
<type>org.netbeans.modules.php.project</type>
|
||||||
|
<configuration>
|
||||||
|
<data xmlns="http://www.netbeans.org/ns/php-project/1">
|
||||||
|
<name>nb-test</name>
|
||||||
|
</data>
|
||||||
|
</configuration>
|
||||||
|
</project>
|
@ -2,7 +2,7 @@ FROM php:8.1-fpm
|
|||||||
|
|
||||||
# https://pecl.php.net/package/xdebug
|
# https://pecl.php.net/package/xdebug
|
||||||
RUN pecl channel-update pecl.php.net && \
|
RUN pecl channel-update pecl.php.net && \
|
||||||
pecl install xdebug-3.1.6
|
pecl install xdebug-3.2.0
|
||||||
|
|
||||||
EXPOSE 9000
|
EXPOSE 9000
|
||||||
WORKDIR /var/www
|
WORKDIR /var/www
|
||||||
|
167
php/php
167
php/php
@ -1,7 +1,162 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#echo ${BASH_ARGV[*]}
|
|
||||||
docker exec test-php php \
|
# Welcome to amusement park!
|
||||||
-dxdebug.mode=debug \
|
|
||||||
-dxdebug.start_with_request=1 \
|
[[ "$1" = '--help' ]] || [[ "$1" = '-h' ]] && cat <<EOF && exit
|
||||||
`basename ${BASH_ARGV[0]}` \
|
NetBeans docker wrapper for php
|
||||||
"${@:1:$#-1}"
|
===============================
|
||||||
|
Anthony Axenov (c) 2023, The MIT License
|
||||||
|
https://axenov.dev
|
||||||
|
https://opensource.org/license/mit
|
||||||
|
|
||||||
|
Replacement host php interpreter with dockerized one to run & debug cli php scripts.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
./$(basename $0) --container=<NAME> [--map=<PATH1>:<PATH2>] [PHP_ARGS] <SCRIPT> [SCRIPT_ARGS]
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
--container : docker container where your SCRIPT is located. Required.
|
||||||
|
--map : sources path mapped from the host to container. Not required.
|
||||||
|
PATH1 is an absolute path to php sources directory on the host.
|
||||||
|
PATH2 is an absolute path of the same directory inside of container.
|
||||||
|
Delimiter ':' is required. If PATH1, PATH2 or delimiter is missed
|
||||||
|
or value is empty then error will be thrown.
|
||||||
|
PHP_ARGS : arguments you can pass to real php interpreter according to its --help.
|
||||||
|
Not required.
|
||||||
|
SCRIPT : a path to script file (.php) to be executed in container. Required.
|
||||||
|
Note that this file must exist inside or be available from that container.
|
||||||
|
SCRIPT_ARGS : arguments to call your script with. They will be passed to script as is.
|
||||||
|
Not required.
|
||||||
|
|
||||||
|
Read this article to know how to set this helper as interpreter for NetBeans:
|
||||||
|
ru: https://axenov.dev/netbeans-php-docker-xdebug-cli
|
||||||
|
en: https://axenov.dev/en/netbeans-php-docker-xdebug-cli-en
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
pwd=$(pwd) # current working directory
|
||||||
|
cmdline=($@) # copy currently called command line to array
|
||||||
|
collect_php_args=1 # should we collect php args or script ones?
|
||||||
|
quiet=0 # should we print some useful data before executing?
|
||||||
|
|
||||||
|
# find a path where this wrapper is located
|
||||||
|
wrapper_dir="$(dirname $0)"
|
||||||
|
|
||||||
|
# find a path where project is probably located
|
||||||
|
project_dir="$(dirname $wrapper_dir)"
|
||||||
|
|
||||||
|
# here we check if this wrapper is global or local
|
||||||
|
# but if it is set as global from nbproject dir of
|
||||||
|
# current project then it is not detected as global
|
||||||
|
# anyway behavior will be correct
|
||||||
|
nbproject="$(basename $wrapper_dir)"
|
||||||
|
[ "$nbproject" = 'nbproject' ] && is_global=0 || is_global=1
|
||||||
|
|
||||||
|
# prepare new array to collect php args
|
||||||
|
declare -a php_cmd=("docker" "exec")
|
||||||
|
|
||||||
|
# and another one for script args
|
||||||
|
declare -a script_args=()
|
||||||
|
|
||||||
|
# and one more for directory mapping
|
||||||
|
declare -a map_arr=()
|
||||||
|
|
||||||
|
# iterate over arguments we received from netbeans
|
||||||
|
for arg in "${cmdline[@]}"; do
|
||||||
|
|
||||||
|
# if this is a container name
|
||||||
|
if [ "${arg::11}" = '--container' ]; then
|
||||||
|
container="${arg:12}" # save it
|
||||||
|
php_cmd+=("$container" 'php') # add php itself
|
||||||
|
continue # jump to next iteration
|
||||||
|
fi
|
||||||
|
|
||||||
|
# if this is a path map
|
||||||
|
if [ "${arg::5}" = '--map' ]; then
|
||||||
|
map="${arg:6}" # save it
|
||||||
|
map_arr=(${map//:/ }) # split it and check if it is correct
|
||||||
|
if [ -z "${map_arr[0]}" ] || [ -z "${map_arr[1]}" ]; then
|
||||||
|
echo "ERROR: directory map is incorrect!"
|
||||||
|
echo "Use $0 --help to get info about how to use this wrapper."
|
||||||
|
echo "Exit code 3."
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
continue # jump to next iteration
|
||||||
|
fi
|
||||||
|
|
||||||
|
# if this is a container name
|
||||||
|
if [ "${arg::7}" = '--quiet' ]; then
|
||||||
|
quiet=1
|
||||||
|
continue # jump to next iteration
|
||||||
|
fi
|
||||||
|
|
||||||
|
# if this is an absolute path to a script file
|
||||||
|
if [ -f "$arg" ]; then
|
||||||
|
# make its path correct for container
|
||||||
|
if [ "$map" ]; then # when paths are mapped
|
||||||
|
# remove first part of map from an absolute filepath and append result to second map part
|
||||||
|
filepath="${map_arr[1]}${arg##${map_arr[0]}}"
|
||||||
|
else # when paths are NOT mapped
|
||||||
|
# remove project path from absolute filepath
|
||||||
|
filepath="${arg##$project_dir/}"
|
||||||
|
fi
|
||||||
|
php_cmd+=("$filepath") # append php args with filepath
|
||||||
|
collect_php_args=0 # now we need to collect script args
|
||||||
|
continue # jump to next iteration
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$collect_php_args" = 1 ]; then # if we collect php args
|
||||||
|
php_cmd+=("$arg") # add current arg to php args as is
|
||||||
|
continue # jump to next iteration
|
||||||
|
fi
|
||||||
|
|
||||||
|
script_args+=("$arg") # otherwise add current arg to script args as is
|
||||||
|
done
|
||||||
|
|
||||||
|
# docker container name is required so we must halt here if there is no one
|
||||||
|
if [ -z "$container" ]; then
|
||||||
|
echo "ERROR: no docker container is specified!" >&2
|
||||||
|
echo "Use $0 --help to get info about how to use this wrapper." >&2
|
||||||
|
echo "Exit code 1." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# path to php script is also required so we must halt here too if there is no one
|
||||||
|
if [ -z "$filepath" ]; then
|
||||||
|
echo "ERROR: no script filepath is specified!" >&2
|
||||||
|
echo "Use $0 --help to get info about how to use this wrapper." >&2
|
||||||
|
echo "Exit code 2." >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
cmdline="${php_cmd[*]} ${script_args[*]}" # make a command to execute
|
||||||
|
|
||||||
|
# print some important data collected above
|
||||||
|
if [ "$quiet" = 0 ]; then
|
||||||
|
echo "NetBeans docker wrapper for php"
|
||||||
|
echo "==============================="
|
||||||
|
echo -e "Container name: $container"
|
||||||
|
echo -e "Script path: $filepath"
|
||||||
|
echo -e "Directory mapping: ${map:-(none)}"
|
||||||
|
echo -e "Command line:\n$cmdline\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# some debug output
|
||||||
|
# echo "=== some debug output ========="
|
||||||
|
# cat <<EOF | column -t
|
||||||
|
# is_global $is_global
|
||||||
|
# container $container
|
||||||
|
# pwd $pwd
|
||||||
|
# wrapper_dir $wrapper_dir
|
||||||
|
# nbproject $nbproject
|
||||||
|
# project_dir $project_dir
|
||||||
|
# map $map
|
||||||
|
# map_arr[0] ${map_arr[0]}
|
||||||
|
# map_arr[1] ${map_arr[1]}
|
||||||
|
# filepath $filepath
|
||||||
|
# EOF
|
||||||
|
# echo "==============================="
|
||||||
|
|
||||||
|
$cmdline # execute
|
||||||
|
|
||||||
|
# that's folks!
|
||||||
|
Loading…
Reference in New Issue
Block a user